我有以下(简化)代码:
var Foo = (function () {
var data = {},
settings = {
// default settings here
};
function bar(callback) { // bar is an asynchronous function
var result = null;
// fiddle around until you get a result
if (callback) {
callback(result);
}
}
return {
init: function (options, callback) {
var kallback = callback;
$.extend(settings, options);
bar(function () {
if (kallback) {
kallback(WHAT_GOES_HERE);
}
});
},
debug: function () {
return {
settings: settings,
data: data
};
},
set: function (k, v) {
settings[k] = v;
},
get: function (k) {
return settings[k];
}
};
}());
上面的代码在js文件中,然后在相关页面的页脚中:
<script type="text/javascript">
Foo.init({ option1: "value", option2: "value" }, function (obj) {
console.log("The object was ", obj);
});
</script>
基本上,我希望能够做到这一点:
我认为this
适用于WHAT_GOES_HERE
以上,但事实证明,至少在我测试它时,this
是DOM Window对象。
首先,我正确构建此对象吗?或者有更好的方法来创建它吗?
其次,假设我这样做是正确的,WHAT_GOES_HERE
应该怎么做才能在console.log("The object was ", foo);
运行时obj
的值是创建的Foo
对象?
答案 0 :(得分:2)
是的,在这种方式调用的匿名函数中, this 将引用窗口对象。要从init方法引用此引用,您必须将引用存储在另一个变量中:
var kallback = callback, self = this;
$.extend(settings, options);
bar(function () {
if (kallback) {
kallback(self);
}
});
构建对象的方式有效,只要你只想拥有一个foo对象。