1

在 JavaScript 中,当使用作为回调的内部函数(例如 AJAX 调用)时,它们在自己的环境中运行(this是窗口对象),并且不知道this它们是在哪里编写的。我已经看到了两种解决方案:

  • 使用selfor that: (通过自动装箱self变量完成)
var Obj = function(){
    var a = 1;

    var subFunc = function(){
        var self = this;
        $.ajax({
            url: 'something.x',
            success: function(data){alert(self);}
        });
    }

    return {
        subtract : subFunc
    }
};

var o = new Obj();
o.substract();
  • 使用bind命令:(我不确定这是如何完成的)
var Obj = function(){
    var a = 1;

    var subFunc = function(){
        $.ajax({
            url: 'something.x',
            success: function(data){alert(this);}.bind(this)
        });
    }

    return {
        subtract : subFunc
    }
};

var o = new Obj();
o.substract();

口译员实际开始口译时有什么区别?这对性能有什么影响?

4

3 回答 3

3

经验丰富的 JS 开发人员通常更喜欢 bind(至少在我工作过的地方)。

JavaScript 作用域一开始很难理解,因为在定义新函数时,闭包中不包含“this”。它可能会让你想放弃,只是创建一个新的局部变量来指向它,但如果你这样做,你会限制自己。

一旦您习惯了 bind 的优势,您就可以始终如一地使用该语言。

你用JS写了很多类吗?一旦习惯了绑定,您就会知道为什么在对象上调用函数与将该函数设置为局部变量然后调用它是不同的,因为您总是在考虑范围。你总是知道“this”来自哪里,因为你声明了它。

您还避免了声明和阅读重复的“self”和“that”变量而使代码库混乱的烦恼。

bind 的缺点是它通常不可用。但是为它编写一个 polyfill(或者只是在网上找到一个)是非常有教育意义的,然后你再也不用担心它了!

我怀疑这两种方式都会对性能产生影响。当然不是在典型的日常使用中。

于 2013-03-01T09:31:17.347 回答
1

一位朋友最近向我指出了使用var selfvs的一个好处。.bind()

对于 exe:

function () {
  var self = this;

  $('selector').map(function () {
    this.attr('href');

    self.doThis();
  });
}

这样您就可以使用两个this范围。我同意另一个答案,即它会使事情变得混乱,但我想它有它的位置。

继承人一个基准 几乎是零差异。再说一次,它是一个非常简单的测试。

于 2014-04-11T18:18:22.740 回答
0

如果您最终不使用绑定,我建议您使用that而不是self.

那是因为self是一个有效的全局变量 (in window.self)。我曾经为我的范围命名self,但有一天我忘记了这var self = this条线......这并不像你想象的那么容易调试。我现在使用thator me,或者更多时候不使用绑定。

于 2014-10-30T04:49:19.100 回答