Javascript 在对象文本中定义函数return

Javascript 在对象文本中定义函数return,javascript,Javascript,我从Crockford的书javascript:The Good Parts学习javascript。他在那里解释了如何使用闭包来封装信息。例如 var myObject = (function () { var value = 0; return { getValue: function () { return value; } }; }()); 如果我理解正确,我们的想法是定义一个返回对象文本的函数。然后调用此

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

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

如果我理解正确,我们的想法是定义一个返回对象文本的函数。然后调用此函数来初始化myObject。但是最外面的括号有什么意义呢。这对()是否足以调用我们定义的函数?

您是对的;最外层的圆括号没有任何作用,尽管通常会将它们放在任何地方——这有助于提高可读性。当人们看到一个用括号括起来的函数时,他们希望它能被立即调用,而如果没有括号,一开始可能就不那么明显了。这里只不过是一个视觉提示

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

例如,以下操作将不起作用:

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...
}
但是,函数表达式不声明变量。相反,它只是创建了一个函数,您可以将其用于某些事情,例如将其分配给变量或仅用于调用

为了生成一个函数表达式,您只需以
函数
以外的内容开头即可。如上所述,一种常见的技术是以括号开始。正如您所提到的,您也可以用
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
当然,如果您试图将函数的结果存储在变量中,您将无法使用这些模式中的任何一种,因为它们都会弄乱返回值。大多数人坚持用括号括起函数,不管它们是否必要,只是为了保持一致性和可读性。

查找“iLife”或“立即调用的函数表达式”。不缺复制品。挑一个。