gpt4 book ai didi

javascript - JavaScript 闭包返回函数的范围和执行上下文

转载 作者:行者123 更新时间:2023-11-29 22:07:11 25 4
gpt4 key购买 nike

如果没有闭包的具体知识,也可以理解该片段:

function closure(){
var i = 1;
i++
var ofunc = function(){return i;};
return ofunc;
}

var x = closure()
x()

将返回:

=> 2

下面的代码片段非常反直觉:

function closure(){
var i=1;
i++
var ofunc = function(){return i;};
i++;
return ofunc;
}

var x = closure()
x()

因为它将返回:

=> 3

尽管第二个增量操作(i++;)跟在 ofunc 之后,当 ofunc 通过 x 调用并且通过x(),它的作用域是闭包closure 被执行,i 计算结果为 3,因此结果。

一个明显的解决方案是:

function closure(){
var i = 1;
i++
var ofunc = function(){return i;}(); //note the parenthesis
i++;
return ofunc;
}

var y = closure()
y //note the missing parenthesis

再次返回更令人欣慰:

=> 2

在这种情况下,ofunc 在其声明期间被执行,因为最后的尾随 (),使用了 i 的当前值, 2. 因此y返回的不是指向ofunc的指针,而是y()执行的结果,而是的执行结果>功能

不幸的是,这破坏了闭包的所有力量,至少在我看来是这样。这就是不立即执行对象函数并在稍后执行时传递参数(给它的指针)的可能性。事实上,如果我们向 ofunc 添加参数:

function closure(){
var i = 1;
i++
var ofunc = function(j){return i+j;};
return ofunc;
}

我们现在可以像这样调用链接函数:

var x = closure()
x(10)

=> 12

此外,如果我们也向 closure 添加参数,我们就可以创建一个参数化的 ofunc 函数类,其中闭包的参数是函数。例如,如果 ofunc 定义了一个对数,闭包的参数可能会被设置为它的底数,每个都会创建不同的底数对数运算,例如:log10 = closure(10)

所以在我看来,() 形式实际上并不有趣。相反,最好通过获取闭包返回的函数的源代码来进行审计/调试,评估了外部参数。不幸的是:

 x.toSource()

我们只得到未计算的形式:

 => '(function (j){return i+j;})'

我们如何在执行closure之后(但在执行x()之前)获取i的实际值?即:

 => '(function (j){return 2+j;})'

最佳答案

只需在变量具有所需值时将其复制到一个新变量即可:

function closure(){
var i = 1;
i++;
var i2 = i; /* Now i2 has desired value, even if you change i */
var ofunc = function(j){return i2+j;};
i++;
return ofunc;
}
var x = closure()
x(5);

另一种可能性:将您想要的 i 作为参数传递给返回另一个函数的自执行函数:

function closure(){
var i = 1;
i++;
var ofunc = (function(i){ return function(j){return i+j;}; })(i);
i++;
return ofunc;
}
var x = closure()
x(5);

关于javascript - JavaScript 闭包返回函数的范围和执行上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20314238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com