这是关于解决这
值。这可以通过以下方式解决:
myObject.something()//这个东西是我的对象window.something()//这是窗户button.onClick=函数()//这个按钮被点击时是按钮
如何解决这个问题已经给出了,这是一个常见的陷阱,比如在下面的示例中使用setTimeout传递回调
var测试=函数(){var me=这个;//设置对此的引用this.sayAgain=函数(){console.log(“你好,我是”+me.toString());}}test.prototype.toString=函数(){返回“test”;}test.prototype.say=函数(){console.log(“你好,我是”+this.toString());}var t=新测试();setTimeout(t.say,50)//=不引用此的窗口传递函数setTimeout(函数(){t.say();},150);//=测试使用函数传递ref设置超时(t.say再次,200)//=使用我作为保存的此上下文进行测试
第二次超时通过关闭对于setTimeout,如果您计划将say回调传递数百次,但只创建两个测试对象实例,那么最后一个实例(sayAgain)的实现将执行得稍微好一些。
这是因为您在创建测试实例时创建闭包,但在将sayAgain作为回调传递时没有创建闭包说
然后多次从函数体中删除this.me和this.sayAgain并传递说
作为结束语。
你可以使用功能.原型.bind但它在IE<8中不受支持,我不确定它是否会像我的示例中使用的那样创建闭包t.say说
.