在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)
}
答案 0 :(得分:1)
关于匿名函数的问题不是不是。采取这两行:
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
,因为它具有更严格的范围规则,因此更容易证明其合理性)