定义返回对象文字的函数

时间:2012-11-20 05:36:44

标签: javascript

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

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

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

1 个答案:

答案 0 :(得分: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

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

相关问题