簡體   English   中英

關於javascript關閉的困惑

[英]Confusion regarding javascript closure

雖然開發人員是客戶端應用程序,但我遇到了一個錯誤,我認為這與我對閉包使用的不完全理解有關。 我已將我的代碼修改為以下內容:


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: reference to undefined property "x"

我想知道為什么會出現這個錯誤,為什么fn2不能訪問fn1返回的本地閉包函數范圍內定義的變量?

簡而言之:閉包可以訪問與聲明它們的位置相關的父作用域,而不是它們的使用位置。

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​​​

我懷疑錯誤在x+=20

var x = 20僅存在於fn1返回的匿名函數的范圍內。 x+=20fn1之前進行求值,因此x在那時甚至不存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM