3

我很难理解JavaScript函数级别的范围,作为一个C#程序员,它看起来与我有关,我将尝试通过代码来解释它:

代码#1

//Problem
//if same named variable (as in global scope) is used inside function scope,
//then variable defined inside function will be used,global one will be shadowed
var a = 123;
function func() {
    alert(a); //returns undefined,why not just return 123 ?
    //how come js knew that there is variable 'a' will be defined and used in 
    //this function scope ,js is interpreter based ?
    var a = 1; //a is defined inside function
    alert(a); //returns 1 
}
func();

代码#2

//when a variable(inside function) not named as same as the global,
//then it can be used inside function,and global variable is not shadowed
var k = 123;
function func2() {
    alert(k); //returns 123 ,why not 'undefined'
    var c = 1;
    alert(c); //returns 1
}
func2();

所以我的问题是

  1. CODE#1为什么第一次aundefined,为什么不只是返回123?怎么会js知道在这个函数范围内定义和使用变量'a',js是基于解释器的吗?

  2. CODE#2为什么不是k“未定义”?

http://jsfiddle.net/Nu2Vu/

4

2 回答 2

7

代码 #1

提升会导致所有变量声明都被带到作用域的顶部,但它会将赋值留在原处。当有对变量的引用时,JavaScript 将首先在当前作用域中查找,如果没有找到该变量,它将继续查找作用域链,直到找到该变量为止。这段代码解释如下:

var a = 123; // global var named a declared, assigned a value
function func() {
  var a; // the declaration of the local var a gets
         // hoisted to the top of the scope, but the
         // assignment is left below, so at the point
         // it is initialized with a value of `undefined`
    alert(a); // looks for a local var named a, finds it but
              // it currently has a value of `undefined`

    a = 1; // now the value is assigned to the local a
    alert(a); // returns 1 
}
func();

代码 #2

由于关闭,此代码的行为方式相同。闭包的一个基本定义是 JavaScript 函数不仅可以访问定义在它们自己作用域中的变量,还可以访问它们的父作用域可用的变量。

var k = 123; // declares and assigns a value to global k
function func2() {
    alert(k); // looks for a local var named k, doesn't find it,
              // looks in its parent scope (the global scope in
              // this case) finds k, returns its value of 123
    var c = 1;
    alert(c); //returns 1
}
func2();
于 2013-04-14T18:31:39.777 回答
5

第一个代码等于:

var a = 123;
function func() {
    var a; //Undefined!
    alert(a); 
    a = 1; 
    alert(a); 
}

这很好地解释了它: https ://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/var

于 2013-04-14T17:59:33.743 回答