关于javascript关闭的困惑

lor*_*non 4 javascript closures

虽然开发人员是客户端应用程序,但我遇到了一个错误,我认为这与我对闭包使用的不完全理解有关.我已将我的代码修改为以下内容:


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);
}])

Run Code Online (Sandbox Code Playgroud)

现在执行:

fn2()
Run Code Online (Sandbox Code Playgroud)

我收到一个错误: ReferenceError: reference to undefined property "x"

我想知道为什么会出现这个错误,为什么fn2不能访问fn1返回的本地闭包函数范围内定义的变量?

bfa*_*tto 8

简而言之:闭包可以访问与声明它们的位置相关的父作用域,而不是它们的使用位置.

返回的函数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???
Run Code Online (Sandbox Code Playgroud)