1.先来看两个题
-----+++-------
var a = 1;
foo();
function foo(){
console.log(a);
};
//输出1
-----+++-------
foo();
var a = 1;
function foo(){
console.log(a);
};
//输出undefined
-----+++-------
首先这两题中应该要注意的是函数声明的提升,也就是function foo(){}会自动被提升到顶部,所以foo()的
调用是可以的。第一个输出1是毫无疑问的!那么第二个实际上被js引擎解析为:
var a;
foo();
a=1;
function foo(){
console.log(a);
};
所以在foo()被执行的时候a还没有被赋值,所以最后输出undefined.
2.再来看看下面的例题
-----+++-------
var a = 1;
function foo(){
a = 10;
return;
};
foo();
console.log(a);
//输出10
-----+++-------
var a = 1;
function foo(){
a = 10;
return;
var a = 2;
};
foo();
console.log(a);
//输出1
-----+++-------
var a = 1;
function foo(){
a = 10;
return;
var function a(){};
};
foo();
console.log(a);
//输出1
-----+++-------
第一个输出10应该没问题,里面给a设置成了全局变量。
而后两个则有所不同,在return语句后给定义了一个数字和函数。
在这里要说一下return!
return这一行分号后面或者隔行的语句都不会被执行,但可以被js引擎解析!
所以后两个会被解析为:
-----+++-------
var a = 1;
function foo(){
var a;
a = 10;
return;
a = 2;
};
foo();
console.log(a);
-----+++-------
var a = 1;
function foo(){
var a;
a = 10;
return;
a = function(){};
};
foo();
console.log(a);
-----+++-------
看到这里大家就知道为什么会输出1.
foo(){}里面a是局部变量,而函数内部的局部变量会在函数执行完毕之后被销毁,
所以最终输出的还是最初定义的a,也就是1.
以上是本人的一点学习心得,多谢指教!
原文:http://www.cnblogs.com/keRee/p/5261183.html