javascript函数声明的范围

时间:2013-02-02 18:39:54

标签: javascript function scope

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

var foo = function() {...}

但是范围是什么

function foo() {...} 

属于?

编辑: 我意识到我没有提出正确的问题,所以作为后续行动。在最外层嵌套中,上述两个声明与以下声明之间存在差异吗?

foo = function() {...}

4 个答案:

答案 0 :(得分:27)

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

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

答案 1 :(得分:8)

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

然而,区别在于,如果它们声明(而不是分配给变量),它们的定义是 hoisted ,因此它们可以在范围内的任何地方使用如果声明出现在代码的末尾。另请参阅var functionName = function() {} vs function functionName() {}

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

答案 3 :(得分:0)

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