this的指向
参考地址:http://home.cnblogs.com/group/topic/69994.html
例1:因为下面有个定时器,所有指向的是全局的,setTimeout 无论在哪里,this指的都是window
1 2 3 4 5 6 7 8 9 10 11 12 | var name = "Bob" ; var nameObj ={ name : "Tom" , showName : function (){ alert( this .name); //BOb }, waitShowName : function (){ setTimeout( this .showName, 1000); } }; nameObj.waitShowName(); |
如果想获取的名称为Tom,代码应该如下:
在执行nameObj.waitShowName函数时,我们先对其this赋给变量that(这是为了避免setTimeout中的匿名函数运行时,
var name = "Bob"; var nameObj ={ name : "Tom", showName : function(){ alert(this.name); }, waitShowName : function(){ var that = this; setTimeout(function(){ that.showName(); }, 1000); } }; nameObj.waitShowName(); //Tom
),然后延迟运行匿名函数,执行that.showName,即nameObj.showName
例2:
1 2 3 4 5 6 7 8 9 10 11 12 13 | var someone = { name: "Bob" , showName: function (){ alert( this .name); } }; var other = { name: "Tom" , showName: someone.showName //这句话等价于:showName: function(){alert(this.name);} 这里的函数来自someone.showName, 所以this指的是当前other } other.showName(); //Tom |
例3:
1 2 3 4 5 6 7 8 9 10 11 12 13 | var name = "Tom" ; var Bob = { name: "Bob" , show: function (){ alert( this .name); } } var show = Bob.show; //这句话等价于:var show = function(){alert(this.name);} 这里的函数来自BOb.show, 所以this指的是window show(); //Tom |
例4:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | var name = "window" ; var Bob = { name: "Bob" , showName: function (){ alert( this .name); } }; var Tom = { name: "Tom" , showName: function (){ var fun = Bob.showName; //这句话等价于:var fun = function(){alert(this.name);} 这里的函数来自BOb.showName, 因为这里重新var 了fun,所以作用域链已经断掉,重新指向了window fun(); } }; Tom.showName(); //window |
例5:eval函数,其执行时候似乎没有指定当前对象,但实际上其this并非指向window,因为该函数执行时的作用域是当前作用域,即等同于在该行将里面的代码填进去
var name = "window"; var Bob = { name: "Bob", showName: function(){ eval("alert(this.name)"); } }; Bob.showName(); //Bob
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步