试图找出如何正确命名我的JavaScript以避免与其他库以及全局项冲突。我正在审查一些代码并注意到一些我在JavaScript方面不理解的东西。在所有现实中,我甚至不知道如何提出问题所以我将使用一些人为的代码示例。
var varFuncTest = (function(){
_funcTest = function(params){
return "These are the params that were passed in: " + params;
};
return _funcTest;
})();
console.log(varFuncTest("params params params"));
输出:这些是传入的参数:params params params
当我运行此代码时,它按预期工作,但这只是因为当我声明变量时,我包装了正在构建并返回()中的特殊函数然后在之后添加()的函数。当我记录函数调用时,我得到正确的字符串打印输出。
现在,当我从最后删除那个额外的()时,因为它们看起来不需要我未经训练的眼睛,日志打印出对象类型而不是字符串。
var varFuncTest = (function(){
_funcTest = function(params){
return "These are the params that were passed in: " + params;
};
return _funcTest;
});
console.log(varFuncTest("params params params"));
OUTPUT:function()
这里发生了什么?为什么需要第二组()?如果这是JavaScript语言的特殊功能,它的内容是什么?在JavaScript API中可以找到它的文档?
代码相同,减去第一个示例第6行的结尾()。它不是一个错字,因为它实际上影响JavaScript中的执行。它们都返回一个被赋值给变量的函数对象。
答案 0 :(得分:3)
您始终使用这些括号:
alert('foo');
这里,括号调用函数alert
并传入参数'foo'
。
以此功能为例:
function test() {
alert('foo');
}
运行test
只会为您提供该功能的参考。 test()
将使用该引用并将其调用。
在您的具体示例中,这正是发生的事情:
var varFuncTest = (function(){
_funcTest = function(params){
return "These are the params that were passed in: " + params;
};
return _funcTest;
})();
function() {...}
返回另一个函数(_funcTest
)。最后那些括号调用返回的函数。如果省略它们,varFuncTest
将存储一个函数。如果你保留它们,varFuncTest
将存储该函数的输出。
为了说明这一点,执行第二块代码,然后运行:
varFuncTest();
您应该获得与第一个代码块相同的输出。
答案 1 :(得分:1)
Javacript的概念是immediately invoked function
。这是一个定义后立即调用的函数。这些必须是function expressions
而不是function statements
。
var a = function() {return "hi"}; // A reference to a function.. to call later.
alert(a()); // Call the function now.
VS
var a = (function() {return "hi"}()); // Call the function, return the value in one stop.
// a now has the result of the function.
alert(a);
所给出的许多答案都是真实的,或者是真实的,但还有另一个方面,他们都没有提到过。
进行作业时,例如
var a = (function() {}());
最外层的parens是编译器需要的 NOT ,但它们服务器通知人类读取代码,即立即调用的函数已到位。
另一方面,代码如
(function() {}()); // One style
(function() {})(); // Another style
需要强制编译器读取表达式的parens ,因此需要function-expression
,而不是function statement
。
使用function
关键字前面的几乎所有其他运算符,例如:
!function() {}(); // Another style
虽然有效,但对于Javascript而言,这并不是正常的“成语”。
TL-DR:除了计算机之外,人们更多的是人类的缘故。
BTW:请坚持使用标准编码约定。你可以做很多非标准但合法的事情。别。它让跟在你后面的人感到困惑。