1

我想调用一些出于自身目的需要定义一些变量的javascript代码,但我想将其隔离,以免污染全局范围。所以我将所有内容包装在一个匿名函数对象中,立即调用它,并且不将它或结果分配给任何东西:

function() {
    var myInnerHelperFunction = function(object) {
        //do some work
    };

    var anObject = ...;

    myInnerHelperFunction(anObject);
}();

但我得到一个语法错误:SyntaxError: Unexpected token (

4

1 回答 1

8

您不能调用函数声明。你需要把它变成一个表达式。实现这一点的最常见技术是将函数包装在括号中:

(function() {
    var myInnerHelperFunction = function(object) {
        //do some work
    };

    var anObject = ...;

    myInnerHelperFunction(anObject);
}());

但是,请注意,任何一元运算符也可以工作(任何导致构造被解析为表达式,而不是声明):

~function example() {
    console.log("example");
}();

为了进一步扩展这一点,您的代码实际上会引发语法错误,因为您的函数缺少标识符。“程序”只能包含语句和函数声明。因此,您的代码必须被解析为函数声明。函数声明必须有标识符。你的没有,所以你的程序是无效的。

当您在函数周围加上括号时,解析树是不同的。括号被解析为“表达式语句”,它可以包含一个表达式。由于函数可以被解析为表达式或声明,取决于它们出现的上下文,这是合法的,并且函数被解析为表达式。由于可以立即调用函数表达式,因此这是可行的。

于 2013-02-14T14:01:47.830 回答