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);输出结果就是:undefinedundefinedundefinedundefined因为使用new来声明函数,创建了一个test() 对象test,所以函数体内的this指针指向test,由于test并没有定义a,b的值,返回undefined。

浙公网安备 33010602011771号