[英]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+=20
在fn1
之前進行求值,因此x
在那時甚至不存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.