Javascript 如何创建一个不使用';t继承词法范围?

Javascript 如何创建一个不使用';t继承词法范围?,javascript,Javascript,以下JavaScript违反CSP(如果CSP具有默认设置): 但此备选方案继承其父范围: (function() { var foo = '42'; return function Thing() {}; }()); 我相信这可以防止foo被垃圾收集 如果您被限制在IIFE中编写代码,是否有办法将函数定义放在全局范围内(请注意,我不是说在全局范围内访问它,我是说它的定义存在于全局范围内)?我不太确定您在这里试图实现什么,因为您提供的代码没有任何实际用途。将创建并分配变量foo,并返回

以下JavaScript违反CSP(如果CSP具有默认设置):

但此备选方案继承其父范围:

(function() {
  var foo = '42';
  return function Thing() {};
}());
我相信这可以防止
foo
被垃圾收集


如果您被限制在IIFE中编写代码,是否有办法将函数定义放在全局范围内(请注意,我不是说在全局范围内访问它,我是说它的定义存在于全局范围内)?

我不太确定您在这里试图实现什么,因为您提供的代码没有任何实际用途。将创建并分配变量
foo
,并返回函数
Thing
,但一旦执行IIFE,所有引用都将丢失,并将进行垃圾收集

例如,如果我使函数更有用一些,下面将生成
thing
函数,变量
foo
将仍然存在,因为它被关闭-请参阅

如果不在内部函数中引用
foo
,则该引用将不会被维护,并将被垃圾收集

如果对模块使用对象文字,则可以使用
this
限制范围。在以下示例中,
generateThing
函数引用模块的
foo
字段。在执行期间,该值将在词法范围内可用。但是,如果您创建了一个内部函数,则上下文
将不同。因此,当您调用返回的函数时,它将输出
undefined

您可以使用
apply
功能(以及其他功能)控制
的上下文。通过使用
myModule
作为上下文调用函数,我们可以引用
foo
变量

(function() {
    var myModule = {
        foo: 42,
        generateThing: function() {
            console.log("generateThing", this.foo);
            return function() {
                console.log("thing:", this.foo);
            }
        }
    }

    window.myModule = myModule;

}());

var thing = myModule.generateThing(); // log: generateThing 42
thing(); // log: thing undefined
thing.apply(myModule); // output: thing 42

我不太确定您在这里想要实现什么,因为您提供的代码没有任何实际用途。将创建并分配变量
foo
,并返回函数
Thing
,但一旦执行IIFE,所有引用都将丢失,并将进行垃圾收集

例如,如果我使函数更有用一些,下面将生成
thing
函数,变量
foo
将仍然存在,因为它被关闭-请参阅

如果不在内部函数中引用
foo
,则该引用将不会被维护,并将被垃圾收集

如果对模块使用对象文字,则可以使用
this
限制范围。在以下示例中,
generateThing
函数引用模块的
foo
字段。在执行期间,该值将在词法范围内可用。但是,如果您创建了一个内部函数,则上下文
将不同。因此,当您调用返回的函数时,它将输出
undefined

您可以使用
apply
功能(以及其他功能)控制
的上下文。通过使用
myModule
作为上下文调用函数,我们可以引用
foo
变量

(function() {
    var myModule = {
        foo: 42,
        generateThing: function() {
            console.log("generateThing", this.foo);
            return function() {
                console.log("thing:", this.foo);
            }
        }
    }

    window.myModule = myModule;

}());

var thing = myModule.generateThing(); // log: generateThing 42
thing(); // log: thing undefined
thing.apply(myModule); // output: thing 42
(function() {
    var myModule = {
        foo: 42,
        generateThing: function() {
            console.log("generateThing", this.foo);
            return function() {
                console.log("thing:", this.foo);
            }
        }
    }

    window.myModule = myModule;

}());

var thing = myModule.generateThing(); // log: generateThing 42
thing(); // log: thing undefined
thing.apply(myModule); // output: thing 42