21

javascript 中的var关键字导致变量存储在本地范围内。没有var变量属于全局范围。函数呢?很清楚当函数被声明为变量时会发生什么

var foo = function() {...}

但是作用域是什么

function foo() {...} 

属于?

编辑:我意识到我没有问完全正确的问题,所以作为跟进。在最外层的嵌套中,上面的两个声明和下面的声明有区别吗?

foo = function() {...}
4

4 回答 4

27

它始终属于当前范围。例如:

// global scope

// foo is a global function
function foo() {

    // bar is local to foo
    function bar() {

    }

}

关于你的第二个问题,这个:

foo = function() {...}

是分配给全局变量的匿名函数表达式(除非您运行的是严格模式,否则foo将是未定义的)。和之间的区别在于function foo() {}后者是一个函数声明(相对于变量声明,它被分配了一个匿名函数表达式)。

您可能会对这篇关于函数声明和函数表达式的优秀文章感兴趣:命名函数表达式揭秘

于 2013-02-02T18:41:18.537 回答
11

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

但是,不同之处在于,如果它们被声明(而不是分配给变量),它们的定义将被提升,因此即使声明出现在代码末尾,它们也将在范围内的任何地方可用。另见var functionName = function() {} vs function functionName() {}

于 2013-02-02T18:49:07.210 回答
5

考虑到隐式全局变量的值得注意的区别:

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

于 2013-12-16T23:43:52.737 回答
0

您的第一个示例 ( var foo = function() {...}) 称为匿名函数。它是在运行时动态声明的,并不遵循与普通函数相同的规则,而是遵循变量的规则。

于 2013-02-02T18:45:37.947 回答