2013-02-02 42 views
16

javascript中的var关键字导致变量存储在本地作用域中。没有var变量属于全局范围。关于功能呢?很明显,当函数声明变量一样函数声明的javascript作用域

var foo = function() {...} 

会发生什么,但什么范围呢

function foo() {...} 

属于哪一种?

编辑: 我意识到我并没有问很正确的问题,因此后续。在最外面的嵌套中,上面的两个声明和下面的声明有区别吗?

foo = function() {...} 

回答

25

它属于当前范围,总是。例如:

// 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

+0

这是一篇很棒的文章。谢谢。 – user1816847

+1

我忘记提到的一个显着差异是Bergi在他的回答中所说的:函数声明被挂起,所以你可以在函数实际出现在源代码之前调用函数。 – bfavaretto

0

你的第一个例子(var foo = function() {...})被称为匿名函数。它在运行时动态声明,并不遵循与正常函数相同的规则,但遵循变量规则。

+0

这真是令人困惑,因为很多文档都说“像函数一样的对象”,而没有对我在OP中提到的区别进行更严格的讨论。 – user1816847

7

函数声明对于当前作用域总是局部的,就像使用关键字var声明的变量一样。

然而,不同的是,如果他们是宣布(而不是分配给一个变量)的定义是悬挂,所以他们会使用无处不在的范围内,即使申报进来的结束码。另见var functionName = function() {} vs function functionName() {}

3

值得注意的区别考虑隐含全局考虑:

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,则会定义隐式全局变量。它是一种适用于变量声明和函数表达式的危险危险。