日期:2014-05-16  浏览次数:20415 次

一段看似简单的js代码的运行结果,很奇怪,哪位大师能给解释下?。。
结果在后面的注释中。

JScript code
var number = 2;

function getNumber() {
    return this.number;
}

function getNumber2() {
    number = 4;
    console.log("a " + number); // 4

    var number;
    console.log("b " + number); // 4

    number = number * 2;
    console.log("c " + number); //8

    getNumber();

    function getNumber() {
        console.log("d " + this.number); // 2
        return this.number;
    }
}

console.log("e " + getNumber2()); // undefined
console.log("f " + getNumber()); // 2


------解决方案--------------------
1 var的作用。如果在函数中使用var,则变量是局部变量,这样同名的全部变量会失效的。
2 number定义,而number2没有定义。是因为js是先解析的。var number,number2是声明了,而没有定义。而函数第一行number=4,则是对var number的定义。这里应该是对局部变量复制为4,并没有修改全局变量number。
3 函数的调用要理解this的使用。this是和对象有关的。xxx.getNumber(),那么this就是指xxx对象。如果简单函数调用,this就是windows对象,this.number就是全局变量。this的概念请参考
http://yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/
------解决方案--------------------
探讨

引用:

1 var的作用。如果在函数中使用var,则变量是局部变量,这样同名的全部变量会失效的。
2 number定义,而number2没有定义。是因为js是先解析的。var number,number2是声明了,而没有定义。而函数第一行number=4,则是对var number的定义。这里应该是对局部变量复制为4,并没有修改全局变量number。
3 函数的调用要……

------解决方案--------------------
a=4 修改为var a=4;
看是什么效果?


------解决方案--------------------
详细请参考《Javascript 高级程序设计》 4.2章 执行环境和作用域