如何在不修改全局范围的情况下执行一些javascript?

lms*_*lms 1 javascript

我想调用一些javascript代码,为了它自己的目的需要定义一些变量,但我想隔离它,所以它不会污染全局范围.所以我将所有东西都包装在一个匿名函数对象中,立即调用它,不要将它或结果赋给任何东西:

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

    var anObject = ...;

    myInnerHelperFunction(anObject);
}();
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*ice 8

您无法调用函数声明.你需要把它变成一个表达式.最常见的技术是将函数包装在括号中:

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

    var anObject = ...;

    myInnerHelperFunction(anObject);
}());
Run Code Online (Sandbox Code Playgroud)

但是,请注意,任何一元运算符也将起作用(导致构造被解析为表达式而不是声明的任何东西):

~function example() {
    console.log("example");
}();
Run Code Online (Sandbox Code Playgroud)

为了进一步扩展,您的代码实际上会抛出语法错误,因为您的函数缺少标识符."程序"只能包含语句和函数声明.因此,必须将代码解析为函数声明.函数声明必须具有标识符.你没有,所以你的程序无效.

当您在函数周围括起括号时,解析树就不同了.括号被解析为"表达式语句",它可以包含表达式.由于函数可以解析为表达式或声明,这取决于它们出现的上下文,这是合法的,并且函数被解析为表达式.由于可以立即调用函数表达式,因此可以正常工作.