javascript scope of function declarations

百般思念 提交于 2019-12-10 01:14:19

问题


The var keyword in javascript causes a variable to be stored in the local scope. Without var variables belong to the global scope. What about functions? It's clear what happens when functions are declared like variables

var foo = function() {...}

but what scope does

function foo() {...} 

belong to?

EDIT: I realized I didn't ask quite the right question so as a follow up. In the outer most nesting is there a difference between the above two declarations and the following declaration?

foo = function() {...}

回答1:


It belongs to the current scope, always. For example:

// global scope

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

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

    }

}

Regarding your second question, this:

foo = function() {...}

is an anonymous function expression assigned to a global variable (unless you're running is strict mode, then foo would be undefined). The difference between that and function foo() {} is that the latter is a function declaration (versus a variable declaration, which is assigned an anonymous function expression).

You might be interested in this excellent article about function declarations and function expressions: Named function expressions demystified.




回答2:


Function declarations are always local to the current scope, like a variable declared with the var keyword.

However, the difference is that if they are declared (instead of assigned to a variable) their definition is hoisted, so they will be usable everywhere in the scope even if the declaration comes in the end of the code. See also var functionName = function() {} vs function functionName() {}.




回答3:


Noteworthy distinction taking implicit globals into account:

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.
  }
}

Hopefully that clarifies a little. Implicit globals are defined if you forget a var before your assignment. Its a dangerous hazard that applies to variable declarations and functional expressions.




回答4:


Your first example (var foo = function() {...}) is called an anonymous function. It is dynamically declared at runtime, and doesn't follow the same rules as a normal function, but follows the rules of variables.



来源:https://stackoverflow.com/questions/14665160/javascript-scope-of-function-declarations

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!