0

试图弄清楚如何正确命名我的 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"));

输出:函数(​​)

这里发生了什么?为什么需要第二组 ()?如果这是 JavaScript 语言的一个特殊功能,它指的是什么,它的文档在 JavaScript API 中的哪里可以找到?

代码是相同的减去第一个示例第 6 行的结尾 ()。这不是一个错字,因为它实际上会影响 JavaScript 中的执行。它们都返回一个分配给变量的函数对象。

4

2 回答 2

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();

您应该得到与第一个代码块相同的输出。

于 2012-10-31T21:25:43.337 回答
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.

对比

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() {}());

编译器不需要最外层的括号,但它们会通知阅读代码的人立即调用的函数已经到位。

另一方面,代码如

(function() {}());  // One style
(function() {})();  // Another style

需要括号强制编译器读取表达式,因此 a function-expression,而不是 a function statement

在关键字前面使用几乎任何其他运算符都function有效,例如:

!function() {}();  // Another style

虽然这行得通,但它不是 Javascript 的正常“成语”。

TL-DR:parens 的存在更多是为了人类而不是计算机。

顺便说一句:请坚持标准的编码约定。您可以做很多非标准但合法的事情。不。它使追随你的人感到困惑。

于 2012-10-31T21:41:42.680 回答