如果匿名JavaScript函数可以访问所有变量,那么常规函数呢?

时间:2018-12-08 15:22:09

标签: javascript anonymous-function

在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)
}

1 个答案:

答案 0 :(得分:1)

关于匿名函数的问题不是不是。采取这两行:

 setInterval(function named (){ alert(a) }, 3000);
 setInterval(function(){ alert(a) }, 3000);

两者都起作用,尽管其中一个被命名,而一个没有被命名。这里的真正问题是范围界定,adummy不可见,因为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,因为它具有更严格的范围规则,因此更容易证明其合理性)