我正在开始使用javascript并仍然在学习。我遇到了这个带有不同函数声明的代码。 funcA
,funcB
和funcX
之间有什么区别?在代码funcA
中,funcB
在模块中使用,funcX
& funcY
从模块外部调用为someModule.funcX()
。可能非常简单,但我不知道甚至做了什么调用。任何指针都将受到赞赏。
var someModule = (function() {
var funcA = (function() {...})();
var funcB = function() {...};
return {
funcX: function(){...},
funcY: function(){...}
};
})();
答案 0 :(得分:2)
如果你只是想要这里所有功能之间的区别是差异。
funcA
,funcB
和funcX
,funcY
之间的第一个区别。
我们return
语句中的任何内容都可由someModule
访问。所以我们可以在下面做这两件事
someModule.funcX();
someModule.funcY();
但是我们不能someModule.funcA() or someModule.funcB()
。要理解为什么我们可以这样做是为了理解()
这种行为的方式。
将执行括号内的任何表达式,并在那里返回结果。所以在这个例子中我们在这些括号中放了一个function
,所以在内存中创建一个匿名函数,它将在这里返回。
现在我们在函数声明后添加了一对括号。那么,这里发生的是(returned function object)()
。因此,将立即调用此函数,并返回包含两个属性funcX
和funcY
的对象,其值为函数。
现在转移到函数内部的第二部分。 funcA
和funcB
之间的区别在于funcA
与someModule
相同,即它也是IIFE,并且取决于funcA
的正文,它将决定如果我们从funcA
的主体内部返回函数对象,那么它也将是一个函数,否则它将包含我们从funcA
的主体内部返回的任何内容。
除此之外,所有其他都是简单的功能。
此外,与所询问的内容无关。我们可以在funcA
和funcB
内访问funcX
和funcY
,即使在执行包含函数之后,我们仍然可以访问这两个函数。有关此行为的更多详细信息,请查看JavaScript中的闭包。快乐学习JavaScript。 :)
答案 1 :(得分:1)
这只是一个模块模式。 编写它的方式与显示模块模式非常相似。
基本上,你的函数返回一些东西(任何东西,真的),这是一个模块的公共接口(请注意,通过接口我不是指需要实现的东西,只是这是交互的端点与模块一样,如API)。
这样做的经典方式(作为揭示模块模式)实际上是:
var someModule = (function() {
var funcA = (function() {...})();
var funcB = function() {...};
var funcX = function(){...}
var funcY = function(){..}
return {
funcX: funcX,
funcY: funcY
};
})();
这被称为揭示模块模式的原因是因为您在模块中定义了模块以及所有私有和公共函数,最后揭示了您想要公开的内容。
这样可以很容易地理解内部发生的事情并在必要时进行更改。
快速了解各种模块模式的一个很好的资源是this site
答案 2 :(得分:1)
安德鲁,
所以它有点令人困惑,但这是非常基本的javascript怪异。
您可以将函数保存在如下变量中:
var a = function(){return 30}
此处a
保留函数本身。然后,您可以使用():
a() // result is 30;
或者我可以忘记变量,只需通过将()添加到结尾来调用函数:
(function(){return 30})();
这也导致30,虽然我们没有将它分配给任何东西。
现在,如果我将最后一个分配给变量:
var b = (function(){return 30})();
与上面保持函数本身的a
不同,b保存结果,无论调用函数是什么 - b是30因为函数被调用而然后结果分配给b。