我在Sortables类上测试了Jakobs补丁,this line this.reset()
给了我一个Uncaught TypeError: undefined is not a function
。
我不明白为什么从班级has a method reset开始。
所以我的解决方案是在同一个var self = this;
方法(here)内的end:
,并在与我self.reset();
相同的行中调用this.reset();
之前。工作得很好。为什么呢?
然后只是检查(我已经怀疑)我做了console.log(this == self)
并给了false
。
为什么使用self
但不是this
?
答案 0 :(得分:3)
在javascript中,this
关键字会随执行上下文一起更改
this
中的global
对象eval
内,范围与调用上下文相同,如果没有提供上下文,则与上面相同.bind
.call
或.apply
的此参数不是对象(或null
){ {1}}将是this
对象global
绑定到特定对象的函数,然后.bind
引用传递给bind的此参数时,该函数现在为 permabinded this
之前有一个点(()
)或.
运算符,则{{1} }指的是此类运算符左侧的部分,除非该函数是 permabinded 到其他内容,或者我们正在使用[]
或this
,如果.call
指的话到此参数,除非该函数以前是 permabinded ; .apply
之前,那么this
和()
运算符都不会.
引用[]
对象(除非函数存储this
函数的结果)global
时).bind
指的是我们正在创建的对象现在当使用new
时,事情发生了一些变化,主要是在没有给出上下文的情况下代替全局对象this
将是use strict directive
,但并非在所有情况下。
我很少使用"使用严格的"所以我建议你在需要时自己尝试一下。
现在,当函数缓存在变量中时会发生什么:
this
如果您丢失了存储原始函数的上下文,那么在这种情况下, foo 将不再是实例 A 上的属性,并且当您运行时它使用
null
将使用我在上面编写的规则评估上下文,在这种情况下,这将引用var cache = 'A.foo'
对象。
答案 1 :(得分:1)
kentaromiura的回答是绝对正确的。
也就是说,mootools提供function.bind()
作为决定this
将在你的函数内部引用的方法。这意味着如果你只是这样做:
var destroy = function () {
`bind() [...]
this.reset();
}.bind(this);
它会按预期工作(即this
在destroy()
内外都是相同的。
现在,许多程序员都不愿意摆弄上下文,因为它很难阅读和维护。但在这里你有它,我认为bind()
是一个非常漂亮的mootools技巧。