当前位置: 首页 > 图文教程 > 网络编程 > Javascript > 一个对于js this关键字的问题

Javascript
一个qq菜单效果
一个用js实现过滤重复字符的函数
javascript 一个自定义长度的文本自动换行的函数
用js实现的一个根据内容自动生成表格的函数
图片格式的JavaScript和CSS速查手册
关于恒等于(===)和非恒等于(!==)
fix-ie5.js扩展在IE5下不能使用的几个方法
javascript实现上传图片前的预览(TX的面试题)
lib.utf.js
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
真见识了-全代码编写的图片
ASP中用Join和Array,可以加快字符连接速度的代码
javascript之弹出窗口居中的代码
识别操作系统是不是vista的js代码
js自动滑动+鼠标滑动区域
LBS blog sql注射漏洞[All version]-官方已有补丁
有一段有意思的代码-javascript现实多行信息
javascript在一段文字中的光标处插入其他文字
Google韩国首页图标动画效果
新发现原来documenet.URL也可以实现页面跳转

Javascript 中的 一个对于js this关键字的问题


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-12   浏览: 202 ::
收藏到网摘: n/a

所以拿出来与大家共勉:
先运行以下的js代码
<script>
foo = {
'bar': function () {
alert(this);
},
'toString': function () {
return 'foo';
}
};
foo.bar();//返回的是"foo"
(foo.bar)();//返回的是"[object Window]"
(foo.bar || null)();//返回的是"[object Window]"
bar = foo.bar; bar();//返回的是"[object Window]"
</script>
我对这里的代码的解释:
foo.bar(); //打印foo
//1. alert隐式调用toString方法,转型成字符串,在foo里重写了toString方法,因此为foo
(foo.bar)();//打印foo
//2. 这里的执行同上
(foo.bar || null)();
/*
3. 这里在IE6.0,Mozilla Firefox1.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();//返回的是"[object Window]"
/*4.
这里在IE6.0,Mozilla Firefox1.5.0.7和Opera9.0里都为相同的object,如果理解上面的执行,理解这句显然会比较简单
理由同上,这里把foo.bar的引用给到一个全局变量bar,而全局变量都隶属于window的引用,看下面代码:
var a = '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,在这里依然有效,并没有成为window object
因为很明显的bar属性window,因此引用foo.bar里虽然有this,但是this引用为window
*/
再看看我们把这个例子改成这样:
<script>
foo = {
'bar': function () {
var oSelf = 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)返回的是一个全局引用