use*_*847 18 javascript scope function
varjavascript中的关键字导致变量存储在本地范围中.没有var变量属于全局范围.功能怎么样?很清楚当函数被声明为变量时会发生什么
var foo = function() {...}
Run Code Online (Sandbox Code Playgroud)
但是范围如何
function foo() {...}
Run Code Online (Sandbox Code Playgroud)
属于?
编辑:我意识到我没有提出正确的问题,所以作为后续行动.在最外层的嵌套中,上述两个声明和下面的声明之间有区别吗?
foo = function() {...}
Run Code Online (Sandbox Code Playgroud)
bfa*_*tto 27
它始终属于当前范围.例如:
// global scope
// foo is a global function
function foo() {
// bar is local to foo
function bar() {
}
}
Run Code Online (Sandbox Code Playgroud)
关于你的第二个问题,这个:
foo = function() {...}
Run Code Online (Sandbox Code Playgroud)
是一个分配给全局变量的匿名函数表达式(除非您运行的是严格模式,否则foo将是未定义的).它之间的区别在于function foo() {}后者是一个函数声明(相对于变量声明,它被赋予一个匿名函数表达式).
您可能对这篇关于函数声明和函数表达式的优秀文章感兴趣:命名函数表达式揭秘.
函数声明始终是当前作用域的本地,就像使用var关键字声明的变量一样.
但是,不同之处在于,如果它们被声明(而不是分配给变量),它们的定义将被提升,因此即使声明出现在代码的末尾,它们也可以在范围内的任何地方使用.另请参见var functionName = function(){} vs function functionName(){}.
考虑到隐式全局变量的值得注意的区别:
var foo = function() {
// Variables
var myVar1 = 42; // Local variable
myVar2 = 69; // Implicit global (no 'var')
// Functional Expressions
var myFn1 = function() { ... } // Local
myFn2 = function() { ... } // Implicit global
function sayHi() {
// I am a function declaration. Always local.
}
}
Run Code Online (Sandbox Code Playgroud)
希望这能澄清一点。如果您var在分配之前忘记了 a ,则会定义隐式全局变量。它是适用于变量声明和函数表达式的危险危险。