JavaScript中this指向和变量提升问题,58同城的一道笔试题

先看一道题:

运行test()和 new test()的结果是什么 ?

var a = 5;
function test() {
    a = 0;
    alert(a);
    alert(this.a);
    var a;
    alert(a);
}

0 5 0 0 undefined 0 
  这里涉及到了变量提升和this对象的指向。首先我们要知道在test这个函数中的第四行生命了一个变量a,在实际运行中,虽然变量声明在第四行,但是会提升到作用域的顶部,既test函数的第一行。 
  理解了变量提升,下面就说说直接运行test()发生了什么。 
  运行test(),this指向window对象。所以首先test函数声明了一个变量a并赋值0,这个变量和全局变量a是不干扰的。所以第一个alert(a)输出0,接下来alert(this.a),this指向window对象,所以输出全局对象下的变量a(5),最后一个alert与第一个实际上是一样的,所以还是0。 

  理解了上面的话下面的问题就是为什么执行new test()时第二个弹出的是undefined。当执行new test()时,相当于是实例了一个test对象,这时候this指向的是这个实例。但是这个实例并没有定义属性a,所以alert(this.a)时会是undefined。

 

下面看一道笔试题:

 

var a = “111”;
var b = “222”;
function test() { 

  var a = “333”;
  var b = “444”; 
  alert(this.a);
  alert(this.b); 

}
var test= new test() ;
alert(test.a);
alert(test.b); 
输出结果就是undefined undefined undefined undefined
因为使用new来声明函数,创建了一个test() 对象test,所以函数体内的this指针指向test,由于test并没有定义a,b的值,返回undefined。
 

 

posted @ 2015-03-29 21:41  梁梁梁梁梁Miracle  阅读(516)  评论(0)    收藏  举报