3

我正在从 Crockford 的书 Javascript: The Good Parts 中学习 javascript。他在那里解释了如何使用闭包来封装信息。例如

var myObject = (function () {
    var value = 0;
    return {
        getValue: function () {
            return value;
        }
    };
}());

如果我正确理解了这一点,那么我们的想法是我们定义了一个返回对象字面量的函数。然后调用此函数来初始化 myObject。但是最外面的括号有什么意义呢?[(f...);]。pair () 还不足以调用我们定义的函数吗?

4

1 回答 1

6

你是对的; 最外面的括号什么也不做,尽管通常的做法是无论如何都要放它们——它有助于提高可读性。当人们看到像这样用括号括起来的函数时,他们希望它会立即被调用,而如果括号不在那里,一开始它可能并不那么明显。这里只不过是一个视觉提示。

但是,请注意,在某些情况下需要将函数括起来以使其成为函数表达式而不是函数声明

例如,以下将不起作用

function() {
    // Do something...
}();
// Throws a syntax error.

在这种情况下,你会得到一个语法错误,因为解析器需要一个函数声明,而你没有给这个函数命名。此外,您不能立即调用函数声明。您需要括号将其转换为函数表达式

(function() {
    // Do something...
})();

函数声明和函数表达式的区别在于函数声明可用于声明函数,其方式与var可用于声明变量的方式相同:

// Declare the variable foo.
var foo;

// Declare the function bar.
function bar() {
    // Do something...
}

但是,函数表达式不声明变量。相反,它只是创建一个函数,您可以将其用于某些事情,例如将其分配给变量或仅用于调用。

为了创建一个函数表达式,你只需要以function. 如上所示,一种常见的技术是以括号开头。正如您提到的,您还可以从以下内容开始var something = ...

var foo = function() {
    return 5;
}();
// foo is now 5

你真的可以用任何可以产生有效表达式的东西来开始它:

!function() {
    console.log(1);
}();
// logs 1

~function() {
    console.log(2);
}();
// logs 2

+function() {
    console.log(3);
}();
// logs 3

[ function() {
    console.log(4);
}() ];
// logs 4

'Hello, World' == function() {
    console.log(5);
}();
// logs 5

当然,如果您试图将函数的结果存储在变量中,您将无法使用任何这些模式,因为它们都会与返回值混淆。大多数人坚持将函数包装在括号中,无论它们是否必要,只是为了一致性和可读性。

于 2012-11-20T05:37:43.460 回答