javascript中的var
关键字导致变量存储在本地作用域中。没有var
变量属于全局范围。关于功能呢?很明显,当函数声明变量一样函数声明的javascript作用域
var foo = function() {...}
会发生什么,但什么范围呢
function foo() {...}
属于哪一种?
编辑: 我意识到我并没有问很正确的问题,因此后续。在最外面的嵌套中,上面的两个声明和下面的声明有区别吗?
foo = function() {...}
javascript中的var
关键字导致变量存储在本地作用域中。没有var
变量属于全局范围。关于功能呢?很明显,当函数声明变量一样函数声明的javascript作用域
var foo = function() {...}
会发生什么,但什么范围呢
function foo() {...}
属于哪一种?
编辑: 我意识到我并没有问很正确的问题,因此后续。在最外面的嵌套中,上面的两个声明和下面的声明有区别吗?
foo = function() {...}
它属于当前范围,总是。例如:
// global scope
// foo is a global function
function foo() {
// bar is local to foo
function bar() {
}
}
关于你提到的第二个问题,这一点:
foo = function() {...}
是分配给全局变量的匿名函数表达式(除非你正在运行的是严格的模式,然后foo
将是不确定的) 。与function foo() {}
之间的区别在于后者是功能声明(与变量声明,其被分配了匿名函数表达式)。
您可能对这篇关于函数声明和函数表达式的优秀文章感兴趣:Named function expressions demystified。
你的第一个例子(var foo = function() {...}
)被称为匿名函数。它在运行时动态声明,并不遵循与正常函数相同的规则,但遵循变量规则。
这真是令人困惑,因为很多文档都说“像函数一样的对象”,而没有对我在OP中提到的区别进行更严格的讨论。 – user1816847
函数声明对于当前作用域总是局部的,就像使用关键字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.
}
}
希望这澄清了一点。如果您在分配前忘记var
,则会定义隐式全局变量。它是一种适用于变量声明和函数表达式的危险危险。
这是一篇很棒的文章。谢谢。 – user1816847
我忘记提到的一个显着差异是Bergi在他的回答中所说的:函数声明被挂起,所以你可以在函数实际出现在源代码之前调用函数。 – bfavaretto