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

How to execute some javascript without modifying the global scope?

本文关键字:执行 情况下 javascript 范围 修改 全局      更新时间:2023-09-26

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

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

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

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

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

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

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

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

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