Fle*_*ore 1 javascript jquery namespaces
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
Run Code Online (Sandbox Code Playgroud)
上面我试图创建一个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');
}
};
})();
Run Code Online (Sandbox Code Playgroud)
Edit2:所有jQuery回调似乎都要求以这种方式使用它们,否则就会搞砸了范围.
我认为这是一个范围问题.如果你这样做
$(document).ready(this.useSub);
Run Code Online (Sandbox Code Playgroud)
然后this.useSub将在window范围内执行(因此在函数内部,this指向window对象)并且不存在Sub属性.
尝试:
init: function () {
var obj = this;
$(function(){obj.useSub()});
}
Run Code Online (Sandbox Code Playgroud)
由于某种原因,它不起作用,$(document).ready(function(){obj.useSub()});但它适用于$()快捷方式.