gpt4 book ai didi

javascript - 关于javascript闭包的困惑

转载 作者:搜寻专家 更新时间:2023-11-01 04:58:05 24 4
gpt4 key购买 nike

在开发客户端应用程序时,我遇到了一个错误,我认为这与我对闭包使用的不完全理解有关。我已将代码精简为以下内容:


var fn1 = function(arr){
return function(val){
var idx;
var x = 20;
for (idx in arr) {
arr[idx]();
}
}
}

var fn2 = fn1([function(){
x+= 20;
alert(x);
}])

现在执行:

fn2()

我收到一个错误:
ReferenceError:引用未定义的属性“x”

我想知道为什么会出现这个错误,为什么 fn2 不能访问 fn1 返回的闭包函数局部作用域中定义的变量?

最佳答案

简而言之:闭包可以访问与它们被声明的位置相关的父范围,而不是它们被使用的位置。

fn1 返回的函数可以访问其父函数的范围(fn1 本身),即它可以访问 arr .但是数组内的函数无法访问 fn1 或从它返回的函数内定义的变量,因为这些函数(数组内)是在不同的范围内声明的。

关于您试图用该代码解决的实际问题,我不确定我是否理解正确。看起来您正在尝试将某些功能应用于某个数字。我不明白为什么该数字(在您的示例中为 20)是常量而不是参数。这是我为此提出的解决方案(没有闭包!):

var applyArrayFunctions = function(arr, x){ 
for(var i=0; i<arr.length; i++) {
x = arr[i](x);
}
return x;
}

var num = 2;
var fnArray = [
function(val){
return val + 20;
},
function(val){
return val * 2;
}
];

console.log(applyArrayFunctions(fnArray, num));​ // logs 44​​​

关于javascript - 关于javascript闭包的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11073933/

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