Javascript 使用apply方法调用jQuery document.ready处理程序?
下面是我在一个具有一些复杂依赖项的项目中使用的代码。在确保所有依赖项都已加载后,我启动下面给出的onReadyCallback()。我有两个问题:Javascript 使用apply方法调用jQuery document.ready处理程序?,javascript,jquery,anonymous-function,document-ready,Javascript,Jquery,Anonymous Function,Document Ready,下面是我在一个具有一些复杂依赖项的项目中使用的代码。在确保所有依赖项都已加载后,我启动下面给出的onReadyCallback()。我有两个问题: 使用anonymousHandler.apply(MyNameSpace)是正确的吗?它是针对Document.ready调用的匿名处理程序的apply方法 据我所知,由于我使用的是apply方法,匿名函数将立即启动,而不考虑文档的就绪状态。那么,如何在MyNameSpace的上下文中传递给anonymousHandler,以便函数中的“this”引
var onReadyCallback = function(){
jQuery(document).ready(function(){
if(!this.loggedIn()){
return;
}
...Lots of Code referring to MyNameSpace using "this"
}.apply(MyNameSpace));
};
//load the additional files that are needed and fire onReadyCallback
MyNameSpace.Util.loadFiles(defaultJsFiles,function(){
MyNameSpace.Util.require(['My.App','My.Theme','My.DomHandler'], function(){
onReadyCallback.apply(window);
});
});
使用匿名函数和
通常,
ready
event jQuery函数的调用方式如下
$(function() { /* ... */ });
// or
jQuery(function() { /* ... */ });
// or
jQuery(document).ready(function() { /* ... */ });
底线是,函数没有给定特定的上下文;jQuery为函数提供的实际上下文是HTMLDocument
元素,与参数无关(在上一个示例中,document
)。这是另一个问题
通常,这些函数中的每一个都会在加载完所有内容后调用,但不一定。在您的例子中,在ready
事件发生之前,有一个对MyNameSpace
的引用。即使Javascript是一种类型语言,并且它会在以后发现声明的符号,这也不是一种好的实践。如果在jQuery触发ready
回调函数之前,将MyNameSpace
设置为其他值,该怎么办?您的ready
回调将无法获取该新引用。除非是有意的,否则当所有内容都是….时,应该在ready
回调中进行引用。。。。准备好了
然后,在ready
回调中,还有其他技术可以为函数分配上下文。基本上已经给出了正确的方法来完成你想要做的事情
(function() {
// this == MyNamespace
}).call(MyNamespace);
上面的代码立即执行一个匿名函数,其中this==MyNameSpace
注意:说明应用和调用之间的区别
现在,是您提供的代码的底部部分:
//load the additional files that are needed and fire onReadyCallback
MyNameSpace.Util.loadFiles(defaultJsFiles,function(){
MyNameSpace.Util.require(['My.App','My.Theme','My.DomHandler'], function(){
onReadyCallback.apply(window);
});
});
这是有问题的,也是不必要的。函数onReadyCallback
是否仅在此处需要,还是会被多次调用?如果只需要调用一次,请保留全局命名空间,只需执行以下操作:
//load the additional files that are needed and fire onReadyCallback
MyNameSpace.Util.loadFiles(defaultJsFiles,function(){
MyNameSpace.Util.require(['My.App','My.Theme','My.DomHandler'], function(){
// if everything is done loading, the function will be executed, otherwise
// it's execution will be postponed later
jQuery(function() {
// create our nicely wrapped anonymous function now
(function() {
if(!this.loggedIn()){
return;
}
// ...Lots of Code referring to MyNameSpace using "this"
})(MyNameSpace); // grab our most recent reference of `MyNameSpace`
});
});
});
如果您不喜欢缩进(这只是开发人员的口味),请将ready
回调中的所有内容替换为(类似于):
并在全局空间的外部创建您的函数:
function initMyNameSpace() {
if(!this.loggedIn()){
return;
}
// ...Lots of Code referring to MyNameSpace using "this"
};
但我建议,至少,把它放在require
回调函数中,这样它
some.thing.pretty.deep=value代码>或者当一个函数需要应用于多个而不是所有对象时,因此扩展对象的原型不是一个好主意
不管怎样,这是我的观点,我会这样做,而不知道您的代码或您正在做什么。我希望您的其余代码不会像这样。无意冒犯…@yanick rochon:)你为什么觉得太乱了?任何提示(一篇博客文章、一本书或两本书)都将不胜感激……因为对这条评论的回答需要一些发展,我将为您的评论添加一个答案question@yanick-罗雄,当然。谢谢,任何有助于改进我的编程风格的建议都是非常受欢迎的。谢谢,使用另一个匿名函数似乎可以解决传递上下文的问题。我对javascript还是很陌生:我认为无论文档的就绪状态如何,anonymousHandler.apply(MyNameSpace)都会立即启动的假设是正确的?是的,无论何时运行回调,它都会运行。非常感谢您花时间编写详细的解释,这里有一些非常有用的要点/提示。。。这肯定有助于加深我对这些东西的理解。
initMyNameSpace.apply(MyNameSpace);
function initMyNameSpace() {
if(!this.loggedIn()){
return;
}
// ...Lots of Code referring to MyNameSpace using "this"
};