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


Posted in Javascript onJanuary 09, 2007

所以拿出来与大家共勉:
先运行以下的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)返回的是一个全局引用 

Javascript 相关文章推荐
qTip 基于JQuery的Tooltip插件[兼容性好]
Sep 01 Javascript
利用javascript实现web页面中指定区域打印
Oct 30 Javascript
用js模拟struts2的多action调用示例
May 19 Javascript
javascript对象的创建和访问
Mar 08 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
May 24 Javascript
JS 数字转换为大写金额的简单实例
Aug 04 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
Dec 08 Javascript
AngularJS的ng-click传参的方法
Jun 19 Javascript
vue+iview/elementUi实现城市多选
Mar 28 Javascript
微信小程序发布新版本时自动提示用户更新的方法
Jun 07 Javascript
vue路由守卫及路由守卫无限循环问题详析
Sep 05 Javascript
微信小程序将页面按钮悬浮固定在底部的实现代码
Oct 29 Javascript
JS控件autocomplete 0.11演示及下载 1月5日已更新
Jan 09 #Javascript
根据分辩率调用不同的CSS.
Jan 08 #Javascript
如何用javascript判断录入的日期是否合法
Jan 08 #Javascript
[IE&amp;FireFox兼容]JS对select操作
Jan 07 #Javascript
javascript中的对象和数组的应用技巧
Jan 07 #Javascript
JavaScript For Beginners(转载)
Jan 05 #Javascript
JavaScript的目的分析
Jan 05 #Javascript
You might like
德生PL660的电路分析和打磨
2021/03/02 无线电
德生9700DX电路分析
2021/03/02 无线电
解析PHP中的正则表达式以及模式匹配
2013/06/19 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
2014/08/28 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
laravel安装zend opcache加速器教程
2015/03/02 PHP
orm获取关联表里的属性值
2016/04/17 PHP
网页开发中的容易忽略的问题 javascript HTML中的table
2009/04/15 Javascript
学习ExtJS form布局
2009/10/08 Javascript
jquery maxlength使用说明
2011/09/09 Javascript
详解JS 比较两个Json对象的值是否相等的实例
2013/11/20 Javascript
jQuery标签替换函数replaceWith()的使用例子
2014/08/28 Javascript
jQuery插件EasyUI校验规则 validatebox验证框
2015/11/29 Javascript
jQuery模拟实现天猫购物车动画效果实例代码
2017/05/25 jQuery
js 简易版滚动条实例(适用于移动端H5开发)
2017/06/26 Javascript
JS简单实现父子窗口传值功能示例【未使用iframe框架】
2017/09/20 Javascript
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
python实现linux下使用xcopy的方法
2015/06/28 Python
Python批处理删除和重命名文件夹的实例
2018/07/11 Python
Python numpy.array()生成相同元素数组的示例
2018/11/12 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
pytorch 模型的train模式与eval模式实例
2020/02/20 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
2020/04/23 Python
python实现数据结构中双向循环链表操作的示例
2020/10/09 Python
HTML5+CSS3绘制锯齿状的矩形
2016/03/01 HTML / CSS
全天然狗零食:Best Bully Sticks
2016/09/22 全球购物
高中体育教学反思
2014/01/29 职场文书
《她是我的朋友》教学反思
2014/04/26 职场文书
旅游与酒店管理专业求职信
2014/07/21 职场文书
卫生厅领导班子党的群众路线教育实践活动整改措施
2014/09/20 职场文书
群众路线剖析材料
2014/09/30 职场文书
法院四风对照检查材料思想汇报
2014/10/06 职场文书
加强作风建设心得体会
2014/10/22 职场文书
网络营销计划
2015/01/17 职场文书
金秋助学感谢信
2015/01/21 职场文书
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
2021/05/06 MySQL