面试题自我解析
2013-09-17 15:23 明朝 阅读(215) 评论(0) 编辑 收藏 举报
面试题:
var foo=1; function Foo() { alert(foo); var foo=2; alert(this.foo); this.foo=3; } var m1=Foo(); var m2=new Foo(); console.log(m1); console.log(m2);
这个执行分别是undefined,1,undefined,undefined;为什么呢?
当执行到这句:
var m1=Foo();
函数已经执行,相当于下面这种形式:
function Foo() {
var foo; //预解析 alert(foo); //undefined; foo=2; alert(this.foo); //此时的函数在window下面调用相当于var m1 = window.Foo();所以this指向的是window,在window下有一个叫foo的属性,数值是1;所以弹出1; this.foo=3; }
当执行到这句:
var m2 = new Foo();
函数已经执行,相当于下面这种形式:
function Foo() { var foo; //预解析 alert(foo); //undefined; foo=2; alert(this.foo); //undefined 当执行到这句话的时候,执行环境发生了改变,不再是全局域,在函数内部this还没有添加一个叫foo的属性,所以为undefined; this.foo=3; }
注意:在var声明一个变量,函数声明,以及匿名声明会预解析。
当执行到这句:
console.log(m1); //undefined
因为之前的var m1 = Foo();这个函数并没有返回值,即函数内部没有return一个数值,所以为undefined;
当执行到这句:
console.log(m2); // object
之前的var m2 = new Foo(); m2是构造函数Foo的实例对象。
我理解的是以上内容,欢迎补充拍板。