函数将函数返回给变量。为什么需要额外的()?

时间:2012-10-31 21:16:35

标签: javascript

试图找出如何正确命名我的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中的执行。它们都返回一个被赋值给变量的函数对象。

2 个答案:

答案 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:请坚持使用标准编码约定。你可以做很多非标准但合法的事情。别。它让跟在你后面的人感到困惑。