我应该如何通过函数绑定它?

时间:2014-10-16 14:45:47

标签: javascript jquery

我的代码如下:

function foo(){
  $('div').each(function(){
   //here $(this) refers to selected div
  });
});

现在,当我在setInterval中调用foo时,$(this)不会引用each()方法的div:

setInterval(function(){
  foo();
},5000);

我尝试使用bind():

setInterval(function(){
  foo();
}.bind(this),5000); //or bind(document.querySelectorAll('div'))

我确实错误地引用了div $(this)。我该怎么办?


以下是我未定义的证据:

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

假设您希望each回调中的代码能够访问this调用后setInterval调用的任何值,那么您的代码有两个问题。

首先,您不是bind foo本身。代码

setInterval(function(){
  foo();
}.bind(this),5000);

成功将this绑定到匿名函数function() { foo(); }。然后,此匿名函数直接调用foo,它(在非严格模式下)为调用全局对象thiswindow设置global,任何直接函数调用都会发生。

您需要使用thisfoo明确地将匿名函数call传递给匿名函数内的apply调用:

setInterval(function(){
  foo.call(this);
}.bind(this),5000);

既然foo有正确的this,您需要在this回调中访问each值。为此,您可以参考How to access the correct `this` context inside a callback?,它将指示您将外部this存储在另一个变量中。您只需将this存储在另一个变量中,并在内部回调中使用该变量而不是this

function foo() {
  var outer_this_from_foo = this;

  $('.rsContent').each(function(){
    //here $(this) refers to selected div
    //but outer_this_from_foo refers to the `this` value just outside this callback

    var fI = $('>.img-responsive', outer_this_from_foo);
    // instead of $('>.img-responsive', this)

  });
};