浏览 3447 次
锁定老帖子 主题:js this
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-20
最后修改:2010-01-20
var scope = this; toolbar.add({ iconCls : 'graphOrderAdd', name : 'graphOrder_btn', handler : function(btn) { scope.opToolbarClick(btn) } }); 写ext代码的时候经常这样写scope.opToolbarClick(btn) 为什么不能写this呢
下面贴一段网络上的
JavaScript 中的 this 一直是容易让人误用的,尤其对于熟悉 Java 的程序员来说,因为 JavaScript 中的 this 与 Java 中的 this 有很大不同。在一个 function 的执行过程中,如果变量的前面加上了 this 作为前缀的话,如 this 的值取决于 function 被调用的方式,一共有四种,具体如下:
=================================================================== 那么我上面的那段代码里面的this是什么呢 是window吗 我加上了代码做试验
var scope = this; toolbar.add({ iconCls : 'graphAdd', id:'aaa', name : 'graphBtn', handler : function(btn) { alert(this==window); //false alert(this==scope); //false alert(this.id); //'aaa' scope.opToolbarClick(btn); } }); 那么很明显 handler函数是某个对象的属性 所以他的代码内部this指向的是这个‘某个对象’就是上面handler函数外层的那个{}定义的对象
另一段测试代码 function Container(param) { var that = this; function service() { return this==window; }; alert(service()); //true这个函数不是对象的成员 this指向全局 this.foo1=function(){ return this==window; }; } var a=new Container('aaaa'); alert(a.foo1()); //false foo1函数是对象的成员 this 不是window
我想的可能有不对的地方 望大家不吝赐教 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-01-20
scope = this中的这个this指代的是window对象,按楼主的想法,handler中的若写成this,这个this指代的是 {
iconCls : 'graphOrderAdd', name : 'graphOrder_btn', handler : function(btn) { this.opToolbarClick(btn) } } 这个对象,这两个this是不一样的。 这属于作用域问题,建议楼主看一下js的作用域 |
|
返回顶楼 | |
发表时间:2010-01-20
最后修改:2010-01-20
豆虫1986 写道 scope = this中的这个this指代的是window对象,按楼主的想法,handler中的若写成this,这个this指代的是 {
iconCls : 'graphOrderAdd', name : 'graphOrder_btn', handler : function(btn) { this.opToolbarClick(btn) } } 这个对象,这两个this是不一样的。 这属于作用域问题,建议楼主看一下js的作用域 这段代码是从一段extjs代码中截取出来的,你写过extjs代码就知道这里的this不是window 你可以这样理解 有这么一个对象 { toolbar:new Bar(), opToolbarClick:function(btn){ .... }, foo:function(){ var scope = this; toolbar.add({ iconCls : 'graphOrderAdd', name : 'graphOrder_btn', handler : function(btn) { scope.opToolbarClick(btn) } }); } } function(btn) { this.opToolbarClick(btn) } 这个函数对象的作用域是他的执行环境的作用域(这个执行环境的作用域就包括了这个scope参数),这里的scope参数就被包含在了执行环境的作用域中,然后就被传递到了这个匿名函数的scope里 推荐你看下http://www.jibbering.com/faq/faq_notes/closures.html 记得看英文原版的 |
|
返回顶楼 | |
发表时间:2010-01-20
lich0079 写道 豆虫1986 写道 scope = this中的这个this指代的是window对象,按楼主的想法,handler中的若写成this,这个this指代的是 {
iconCls : 'graphOrderAdd', name : 'graphOrder_btn', handler : function(btn) { this.opToolbarClick(btn) } } 这个对象,这两个this是不一样的。 这属于作用域问题,建议楼主看一下js的作用域 这段代码是从一段extjs代码中截取出来的,你写过extjs代码就知道这里的this不是window 你可以这样理解 有这么一个对象 { toolbar:new Bar(), opToolbarClick:function(btn){ .... }, foo:function(){ var scope = this; toolbar.add({ iconCls : 'graphOrderAdd', name : 'graphOrder_btn', handler : function(btn) { scope.opToolbarClick(btn) } }); } } function(btn) { this.opToolbarClick(btn) } 这个函数对象的作用域是他的执行环境的作用域(这个执行环境的作用域就包括了这个scope参数),这里的scope参数就被包含在了执行环境的作用域中,然后就被传递到了这个匿名函数的scope里 推荐你看下http://www.jibbering.com/faq/faq_notes/closures.html 记得看英文原版的 楼主可能曲解了我的意思,我所说的window不是浏览器的window,就拿你这段代码来说,第一个this就是foo这个function对象,楼主的推荐在下会看的,在此谢过。 |
|
返回顶楼 | |
发表时间:2010-01-20
写错了,是第一个大括号的那个对象,^_^
|
|
返回顶楼 | |