把《javascript高级程序设计》的变量和函数部分翻了一遍,感觉可以找些题看看了。遂找了写经典题目,逐一解析(第二题踩坑了~)
先看题http://blog.csdn.net/YoungerChen/article/details/7934008
均在非严格模式下:
1.
var a = 10; function test() { a = 100; alert(a); alert(this.a); var a; alert(a); } test();
分析:全局变量var a = 10;此时 window.a=10;
注意在方法内有var a;有个很重要的概念:变量声明提前。所有上述代码等同于
var a = 10;
function test() { var a = 100; alert(a); alert(this.a); alert(a); } test();
所以函数内的局部变量a的作用域在函数内,this.a=window.a。所有输出为100 10 100;
2.
var a = 100; function test(){ alert(a); var a = 10; alert(a); } test();
声明提前后的代码为:
var a = 100; function test(){ var a; alert(a); a = 10; alert(a); } test();
大坑(声明提前,赋值不提前)。默认值为undefined 所以正确答案为undefined 10
3.
var a = 100; function test(){ alert(a); a = 10; //去掉了var 就变成定义了全局变量了 alert(a); } test(); alert(a);
这个就很简单了。函数内调用全局变量a。 输出 100 10 10
引申到函数。函数声明和函数表达式,
function say(){ //函数声明 提前 } var say = function(){ //函数表达式 声明提前但值不提前 }
example:
say();//hi function say(){ console.log('hi'); }
say();//error var say = function(){ console.log('hi'); }
总结:
1.函数内局部变量在函数执行完后就会销毁(闭包除外)
2.函数内的this值向允许函数时的对象
3.var声明提前;值不会提前