Sortables Class内部对“this”的引用已更改

时间:2014-04-27 19:35:31

标签: mootools

我在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

Fiddle

2 个答案:

答案 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);

它会按预期工作(即thisdestroy()内外都是相同的。

现在,许多程序员都不愿意摆弄上下文,因为它很难阅读和维护。但在这里你有它,我认为bind()是一个非常漂亮的mootools技巧。