我在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
吗?
答案 0 :(得分:4)
是的,你的setInterval
声明中有一个匿名函数(一个没有名字的函数),它创建了自己的范围。
第一个console.log($(this))
可以访问任何全局或其中设置的任何内容,第二个console.log($(this))
只能访问全局变量(正如您所知,this
在全局范围内是window
对象。
答案 1 :(得分:3)
您可以使用简单的闭包,也可以使用$.proxy
:http://api.jquery.com/jQuery.proxy/
var repeat = function() {
localStorage.setItem("flag", "set");
var data = $(this).serializeArray();
.......
}
setInterval($.proxy(repeat, $("#form")), 500);
像这样......
答案 2 :(得分:2)
不是它在setInterval
内,而是在匿名函数内部。
第一个$(this)
在匿名函数的范围内。第二个$(this)
位于全球范围内。
答案 3 :(得分:0)
this
是对当前对象的引用。它代表一个函数的上下文。默认引用是全局引用(在我们的例子中是window
对象)
由于setInterval
回调正在全局范围内执行,this
将始终指向窗口对象。
以下示例说明this
与范围之间的关联:
var a = "window";
function f(){
console.log(this.a);
}
f();// scope = window
var obj = {a:'object',f:f};
obj.f();// scope = object