Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript闭包和函数放置_Javascript_Performance_Coding Style_Structure_Closures - Fatal编程技术网

javascript闭包和函数放置

javascript闭包和函数放置,javascript,performance,coding-style,structure,closures,Javascript,Performance,Coding Style,Structure,Closures,函数的放置是否会影响范围内闭包的性能?如果是的话,将这些功能放在哪里最合适?如果不是,闭包所隐含的关联是否足以合理地将函数放置在另一个位置 例如,如果foo不依赖于localState的值,那么可以从foo访问localState这一事实是否对foo的执行时间、内存使用等有影响 (function(){ var localState; function foo(){ // code } function bar(){ // co

函数的放置是否会影响范围内闭包的性能?如果是的话,将这些功能放在哪里最合适?如果不是,闭包所隐含的关联是否足以合理地将函数放置在另一个位置

例如,如果foo不依赖于localState的值,那么可以从foo访问localState这一事实是否对foo的执行时间、内存使用等有影响

(function(){
    var localState;

    function foo(){
        // code
    }

    function bar(){
        // code
        return localState;
    }
})();
换句话说,这是一个更好的选择吗?如果是,为什么

(function(){
    function foo(){
        // code
    }

    var localState;

    function bar(){
        // code
        return localState;
    }
})();
已表明上述两个示例是相同的,因为可以从块内的任何位置访问localState。但是,下面的示例(其中foo在块外部定义)可能是不同的情况。你觉得怎么样

function foo(){
    // code
}

(function(){

    var localState;

    function bar(){
        // code
        foo();
        return localState;
    }
})();

var或函数声明的范围是它出现在其中的整个块,而不管声明在块中的什么位置;因此,它会影响效率,这是令人惊讶的


也就是说,在这个块中,“function foo()”是在“var localState”之前还是之后并不重要。“function foo()”是在这个块中还是在一个封闭的块中可能很重要(如果它可以提升到更高的范围,因为它不使用任何局部变量);这取决于Javascript编译器的细节。

我认为不会有任何性能开销,因为java脚本没有使用函数堆栈的概念。它支持词法范围。在闭包调用中执行相同的状态。另一方面,在您的示例中,您似乎没有执行任何语句

这两个代码段是等效的,因为它们都是在您正在创建的匿名函数的(相同)环境中定义的。我想您可以从
foo
中访问
localState


话虽如此。。。如果您正在创建的环境中有大量的变量,那么
foo
的执行时间可能会受到影响,因为变量查找可能需要更长的时间。如果您在中定义的函数中不再使用大量变量,
foo
,并且
foo
也不需要它们,那么
foo
将导致它们不能被垃圾收集,因此这也可能是一个问题。

Javascript中的每个函数都是一个闭包。只有当函数引用变量时,才会产生解析变量值的运行时。例如,在本例中,函数y捕获x的值,即使y未直接引用x:

var x = 3;
function y() eval("x");
y();
3

在你的例子中,差异其实并不重要。即使foo在全局范围内,您也不会有问题

但是,要记住,如果使用将函数赋值给变量的方式来声明函数,那么它们的声明顺序可能会成为一个相当大的问题

要获得更好的想法,请尝试以下两个示例:

CheckOne();
function CheckOne() {
    alert('check...check one.');
}

CheckTwo();
var CheckTwo = function() {
    alert('check...check two.');
};
第二个和第一个的唯一区别是它们用于声明函数的样式。第二个生成一个引用错误


干杯。

你说得对!我试图用“//code”注释暗示一些执行,但显然不是很清楚。谢谢你的回答。事实上,要看到JS确实关闭了未使用的变量,请尝试以下方法:(function(){var a=1;return function(x){eval(x)}()(“alert(a)”)显然,内部函数没有引用
a
,但它是可用的。相反,在Perl中,sub{my$a=1;sub eval$[0]}->('print$a'),不打印任何内容,但sub{my$a=1;sub{$a;eval${[0]}->('$a')确实:Perl关心变量是否被引用以确定它是否被关闭。其次,让我们不要找到更多的方法来创建不可读的代码。请注意,Andrew。即使有一些假设的性能提升,我也希望看到它以最干净、最合乎逻辑的顺序编写。