代码改变世界

面试题自我解析

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的实例对象。

我理解的是以上内容,欢迎补充拍板。