簡體   English   中英

如果匿名JavaScript函數可以訪問所有變量,那么常規函數呢?

[英]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

為了解決這個問題,移動dummya的范圍:

 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.

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