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