[英]Explain why anonymous functions in Javascript can access variables in the outer function?
[英]If anonymous JavaScript functions can access all variables, what about regular functions?
在Javascript中,函數變量是局部變量,除非未用“ var”聲明。 也就是說,除非這些函數是匿名的(例如setInterval和setTimeout中使用的那些)。在那種情況下,它們可以全局訪問稱為匿名函數的范圍內的所有可用變量。
那么常規功能呢? 有沒有辦法讓他們也訪問所有變量? 我之所以這樣問,是因為在某些情況下,父函數在1個父函數下有很多變量,在這種情況下,我突然不得不將它們從匿名函數轉換為常規函數。
例如,假設我的原始匿名函數稱為alert,現在我想通過常規函數來做到這一點:
myFunction()
function myFunction() {
var a='b' //,b=...,c=...,d=...,e=...,f=...,g=...,h=...,i=...,j=...,k=...
setInterval(function(){ alert(a) }, 3000) // Works even though a is local
setInterval(function(){ dummy() }, 3000) // Fails, but would work if I used dummy(a).
// But then I'd have to use dummy(a,b,c,d,e,f,g,h,i,j,k,...)
}
function dummy() { // It would have worked had I used dummy(a)
alert(a)
}
問題不在於匿名功能。 采取以下兩行:
setInterval(function named (){ alert(a) }, 3000);
setInterval(function(){ alert(a) }, 3000);
兩者都可以工作,盡管其中一個被命名,而另一個沒有。 這里真正的問題就是范圍界定, a
是不可見的dummy
,因為dummy
被宣布外a
的范圍:
{ // brackets start a scope
let a = "b"; // a gets declared in this scope
//...
} // scope ends
function dummy() { /*..*/ } // outside of scope
為了解決這個問題,移動dummy
成a
的范圍:
function myFunction() { // start of scope
let a = "b";
setInterval(function(){ dummy() }, 3000);
function dummy() {
alert(a); // a can be accessed as it is inside of the scope
}
} // end of scope
(我用let
代替var
因為它具有更嚴格的規則范圍,因此更容易證明其合理性)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.