在对象文字中定义函数return

Par*_*val 3 javascript

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

var myObject = (function () {
    var value = 0;
    return {
        getValue: function () {
            return value;
        }
    };
}());
Run Code Online (Sandbox Code Playgroud)

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

Nat*_*all 6

你是对的; 最外面的括号什么都不做,虽然通常的做法是把它们放在一边 - 它有助于提高可读性.当人们看到括在括号中的函数时,他们希望立即调用它,而如果括号不在那里,那么最初可能不那么明显.它只不过是一个视觉提示.

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

例如,以下将工作:

function() {
    // Do something...
}();
// Throws a syntax error.
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您将收到语法错误,因为解析器需要一个函数声明,并且您没有为此函数指定名称.另外,您无法立即调用函数声明.您需要使用括号将其转换为函数表达式:

(function() {
    // Do something...
})();
Run Code Online (Sandbox Code Playgroud)

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

// Declare the variable foo.
var foo;

// Declare the function bar.
function bar() {
    // Do something...
}
Run Code Online (Sandbox Code Playgroud)

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

为了创建一个函数表达式,你只需要用其他东西来开始这一行function.如上所述,常见的技术是用括号开始.正如您所提到的,您也可以通过以下方式开始var something = ...:

var foo = function() {
    return 5;
}();
// foo is now 5
Run Code Online (Sandbox Code Playgroud)

你可以用任何可以构成有效表达式的东西来启动它:

!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
Run Code Online (Sandbox Code Playgroud)

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