一个对于js this关键字的问题_Javascript教程-查字典教程网
一个对于js this关键字的问题
一个对于js this关键字的问题
发布时间:2016-12-30 来源:查字典编辑
摘要:所以拿出来与大家共勉:先运行以下的js代码foo={'bar':function(){alert(this);},'toString':fu...

所以拿出来与大家共勉:

先运行以下的js代码

<script>

foo={

'bar':function(){

alert(this);

},

'toString':function(){

return'foo';

}

};

foo.bar();//返回的是"foo"

(foo.bar)();//返回的是"[objectWindow]"

(foo.bar||null)();//返回的是"[objectWindow]"

bar=foo.bar;bar();//返回的是"[objectWindow]"

</script>

我对这里的代码的解释:

foo.bar();//打印foo

//1.alert隐式调用toString方法,转型成字符串,在foo里重写了toString方法,因此为foo

(foo.bar)();//打印foo

//2.这里的执行同上

(foo.bar||null)();

/*

3.这里在IE6.0,MozillaFirefox1.5.0.7和Opera9.0里有不同的效果,IE和Opera都是object,Mozilla的为foo

暂且不谈这几个的JS对||的解释方法,这与bar方法中的this还有和||运算符是有关的。经过||之后

这里的this已经不再为window了,this关键字的作用,如果按照C++的理解,应该为动态联编,而非静态联编,我们平常的例子中

<script>

(function(){

this.div=document.createElement("div");div.innerHTML="never-online";

document.body.appendChild(div);

this.div.onclick=function(){

alert(this.tagName);//这里的this就是div而非匿名函数中的this

}

})()

</script>

也就是说,这里this的作用域不再是foo对象,而是一个全局的作用域。因此alert(this)相当于alert(window);

所以为object

BTW:有可能是||运算符是要把两个表达式的执行转换为全局范围的比较,所以在IE和Opera中,这里(foo.bar||null)返回的是一个全局引用,即:

'bar':function(){

alert(this);//这里的this已经为全局this,全局的this,即为window

},

详细的,我将在篇末加入一段代码,以示说明

*/

bar=foo.bar;bar();//返回的是"[objectWindow]"

/*4.

这里在IE6.0,MozillaFirefox1.5.0.7和Opera9.0里都为相同的object,如果理解上面的执行,理解这句显然会比较简单

理由同上,这里把foo.bar的引用给到一个全局变量bar,而全局变量都隶属于window的引用,看下面代码:

vara='never-online';

alert(this.a);//never-online

alert(window.a);//never-online

如果你尝试着把bar=foo.bar;bar();改成以下代码,或许就可以明白了

foo.alert=foo.bar;foo.alert();

这里的foo.alert依然为foo对象的引用,因此foo对象里的this,在这里依然有效,并没有成为windowobject

因为很明显的bar属性window,因此引用foo.bar里虽然有this,但是this引用为window

*/

再看看我们把这个例子改成这样:

<script>

foo={

'bar':function(){

varoSelf=this;

alert(this.toString);

if(oSelf==window){

oSelf=foo;

}

alert(oSelf);

},

'toString':function(){

return'foo';

}

};

window.toString=function(){

alert("引用全局this---window");

}

foo.bar();

(foo.bar)();

(foo.bar||null)();

bar=foo.bar;bar();

</script>

这样应该明白原因了。

从这个例中(foo.bar||null)();可以看出Mozilla的解释器会更“标准”一些,而Opera和IE的解释方法则与Mozilla的不一样。||运算符的作用,出现了不同的效果。同我上面所说的,有可能是||运算符是要把两个表达式的执行转换为全局范围的比较,所以在IE和Opera中,这里(foo.bar||null)返回的是一个全局引用

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新Javascript教程学习
    热门Javascript教程学习
    编程开发子分类