Javascript 带IIFE的JQuery命名空间模式
我是Javascript新手,希望熟悉最佳实践 今天我遇到了一个新的结构,我需要社区的帮助来理解它。代码依赖于Jquery。结构如下Javascript 带IIFE的JQuery命名空间模式,javascript,jquery,Javascript,Jquery,我是Javascript新手,希望熟悉最佳实践 今天我遇到了一个新的结构,我需要社区的帮助来理解它。代码依赖于Jquery。结构如下 $(function() { var data = { // }; var cont = { // init: function(){ } }; var view = { // }; cont.init(); }()); 我的理解是IIFE被
$(function() {
var data = {
//
};
var cont = {
//
init: function(){
}
};
var view = {
//
};
cont.init();
}());
我的理解是IIFE被传递到JQuery命名空间中
但让我困惑的是,代码只包含3个文本,没有返回语句。你看,我是从模块模式的角度来看这个问题的。在这种情况下,IIFE中使用的模块将返回包含任何预期公共函数的对象文本
此代码不返回对象。事实上,3个对象文本(数据、cont、view)是否只是简单地添加到JQuery名称空间?然而,我的另一部分认为这将简单地将未定义的
返回到JQuery名称空间。请告知
我的理解是IIFE被传递到JQuery命名空间中
没有
IIFE执行并返回未定义的(因为它没有返回语句)
调用$
,并将未定义的传递给它。然后,$
的返回值被丢弃,因为代码对它没有任何作用
调用$
在这里是没有意义的。所有有趣的事情都发生在IIFE内部(当调用cont.init()
时)。更新
请忽略我的回答。我对代码的理解是错误的
你的代码没有意义,我认为它不会执行任何东西。这不是一种生活。这里有更多的信息。iLife与jQuery无关。这是一种定义函数并立即运行它的Javascript方法
如果你做了这样的事情,那就是一种生活,它会立即显示警报。这不需要jQuery
(function() {
var cont = {
init: function () {
alert('test');
}
};
cont.init();
})();
这段代码的作用是定义一个匿名函数,它有一个cont
对象。在cont
中,它定义了一个init
对象,该对象被设置为另一个匿名函数。通过执行cont.init()
,您正在调用init
具有的函数
闭包——即围绕主函数的(
和)
——定义了它。之后的()
调用该函数。实际上,您的代码很混乱。IIFE是这样的(函数(){…})()代码>。现在,如果希望在DOM就绪时使用jQuery运行函数,可以这样做:$(函数(){…})我不知道是谁否决了你的问题,但我投了赞成票。它比我想象的更有趣,我通过进一步阅读从中学到了东西。此SO项目似乎也有丰富的信息:。CheersI发现这是一个关于javascript名称空间的很好的参考:。我也在学习(或试图理解)javascript模块。这是我目前正在读的:。我还把它加入了书签:.@FrankFajardo这里有一个给你的@ImranNazir,是$(document)的快捷方式。ready(function(){…})
是$(function(){…})
@ImranNazir-不。$()
根据你传递给它的内容做了很多不同的事情。传递它undefined
没有任何用处。它是$(document)的缩写形式。准备好了吗
,只有当你传递一个函数时才可以,而这个函数不是。@Quentin,好的,所以它传递的是未定义的,但它可能被看作是一种在JQR名称空间内执行代码的方法,从而使它远离全局名称空间“在JQR名称空间内执行代码”-不可以。您不能“在命名空间内”执行代码。JavaScript本身没有名称空间。JavaScript中的名称空间是一个全局变量(一个对象n次)的对象,其名称由一组相关代码使用(因此您有ME.foo
和ME.bar
和ME
是一个全局变量,而不是将foo
和bar
作为两个全局变量)。这与此无关,它只调用jQuery函数,不传递任何内容。生命避免仅仅通过成为一个生命而创造出全球性。将其返回值传递给jQuery函数没有任何用处。“它不是IIFE。”-是的,它是。它以function(){
开始,以}()
结束(它在表达式上下文中,所以不会出错,因为你不能用()
来跟随函数声明)。“iLife与jQuery无关”-它与jQuery无关,这就是为什么问题是问为什么在$(
和之间使用iLife)
“闭包——即(和)”——这不是闭包。本例中的(
和)
是调用$
函数的参数。当您从另一个函数返回一个函数并从返回的函数内部访问外部函数范围内的变量时,您会得到一个闭包。@Quentin,如果他定义了一个IIFE,为什么它不能正确执行cont.init()?您如何定义闭包?谁说它没有正确执行cont.init()
?通过从另一个函数返回函数并从返回函数内部访问外部函数范围内的变量来定义闭包。