var Test = (function() {
return {
useSub: function () {
this.Sub.sayHi();
},
init: function () {
$(document).ready(this.useSub);
}
};
})();
Test.Sub = (function () {
return {
sayHi: function () {
alert('hi');
}
};
})();
Test.useSub(); // works
Test.init(); // explodes
上面我正在尝试创建一个Test命名空间并向其添加一个对象Sub。我一直很好,直到我尝试在jQuery中使用该对象。错误是“Uncaught TypeError:无法调用方法'sayHi'未定义”。如果有更好的方法,我愿意接受它。
编辑:
显然这是演示代码。在我的实际应用程序中,我使用的解决方案因为我认为最清楚的是这一个:
var Namespace (function () {
return {
init: function () {
$(document).ready(function() {
Namespace.onReady();
}
},
onReady: function() {
alert('Now I am back in the Namespace scope. Proceed as planned');
}
};
})();
Edit2:所有jQuery回调似乎都要求以这种方式使用它们,否则就会搞砸了范围。
答案 0 :(得分:5)
我认为这是一个范围问题。如果你这样做
$(document).ready(this.useSub);
然后this.useSub
将在window
范围内执行(因此在函数内部,this
引用window
对象)并且不存在Sub
范围1}}属性。
尝试:
init: function () {
var obj = this;
$(function(){obj.useSub()});
}
由于某种原因,它不能使用 $(document).ready(function(){obj.useSub()});
,但它适用于$()
快捷方式。
答案 1 :(得分:2)
这是一种方式
var Test = {
useSub : function () {
Test.Sub.sayHi();
},
init: function () {
$(document).ready(Test.useSub);
},
Sub: {
sayHi: function () {
alert('hi');
}
}
};
答案 2 :(得分:1)
在这一行:
$(document).ready(this.useSub);
您正在传递对函数的引用并且范围丢失 - 当函数运行时,this
不再意味着Test
。