在jQuery的setInterval中使用$(this)

在jQuery的setInterval中使用$(this),jquery,this,setinterval,Jquery,This,Setinterval,我在jQuery插件中使用以下代码: setInterval(function() { localStorage.setItem("flag", "set"); var data = $(this).serializeArray(); console.log($(this)); $.each(data, function(i, obj) { localStorage.setItem(obj.name, obj.v

我在jQuery插件中使用以下代码:

setInterval(function() {                        
   localStorage.setItem("flag", "set");
   var data = $(this).serializeArray();
   console.log($(this));
   $.each(data, function(i, obj) {
      localStorage.setItem(obj.name, obj.value);
   });
   console.log('saved');
   console.log(localStorage);                       
}, 5000);

if (localStorage.getItem("flag") == "set") {
   alert("This form has saved data!");
   var data = $(this).serializeArray();
   console.log($(this));
   $.each(data, function(i, obj) {
      $("[name='" + obj.name +"']").val(localStorage.getItem(obj.name));
   });                      
}

奇怪的是,第一个$this包含运行插件的表单,而第二个$this包含DOMWindow。为什么这两个$this包含不同的东西?是因为第一个在setInterval内吗?

是的,您有一个匿名函数,在setInterval声明中没有名称的函数,它创建了自己的作用域


第一个控制台.log$这将有权访问任何全局或其内部设置的任何内容,第二个控制台.log$这将只有权访问全局变量,正如您所发现的,全局范围中的这是窗口对象。

是,您有一个匿名函数,即在setInterval声明中没有名称的函数,它创建自己的作用域

第一个控制台.log$这将有权访问任何全局的或在其自身内设置的任何内容,第二个控制台.log$这将只有权访问全局变量,正如您所发现的,全局范围内的这是窗口对象。

它不在setInterval内,而是在匿名函数内

第一个$this在匿名函数的作用域中。第二个$this在全局范围内。

它不是在setInterval内,而是在匿名函数内


第一个$this在匿名函数的作用域中。第二个$this在全局范围内。

您可以使用简单闭包,也可以使用$。代理:


类似于…

您可以使用简单的闭包,也可以使用$.proxy:

类似于…

这是对当前对象的引用。它表示函数的上下文。在我们的示例中,默认引用是全局引用,即窗口对象。 因为setInterval回调是在全局范围内执行的,所以它总是指向窗口对象。 以下是一些示例,说明了这与范围之间的联系:

var a = "window";
function f(){
    console.log(this.a);
}
f();// scope = window
var obj = {a:'object',f:f};
obj.f();// scope = object
这是对当前对象的引用。它表示函数的上下文。在我们的示例中,默认引用是全局引用,即窗口对象。 因为setInterval回调是在全局范围内执行的,所以它总是指向窗口对象。 以下是一些示例,说明了这与范围之间的联系:

var a = "window";
function f(){
    console.log(this.a);
}
f();// scope = window
var obj = {a:'object',f:f};
obj.f();// scope = object
是的,还请注意,在许多情况下,JQuery会覆盖此内容。是的,还请注意,在许多情况下,JQuery会覆盖此内容。