以下JavaScript违反了CSP(如果CSP具有默认设置):
(function() {
return new Function('return function Thing() {}');
}());
但是这个替代方案继承了它的父范围:
(function() {
var foo = '42';
return function Thing() {};
}());
我相信这会阻止foo
被垃圾收集。
有没有办法在全局范围内放置一个函数定义(请注意,我并不是指在全局范围内访问它,我的意思是它的定义存在于全局范围内),如果您只限于在内部编写代码IIFE?
答案 0 :(得分:2)
我不太确定你要在这里实现什么,因为你提供的代码没有做任何实际使用。将创建并分配变量href="app/nutrition"
,并返回函数foo
,但只要执行IIFE,所有引用都将丢失并将进行垃圾回收。
如果我将函数作为一个例子更有用,下面将生成Thing
函数,变量thing
仍然存在,因为它已关闭 - 参见{{3 }}
foo
如果您没有在内部函数中引用function generateThing() {
var foo = '42';
return function thing() {
console.log("thing:", foo)
};
}
var myThing = generateThing();
myThing();
,则不会保留引用,并且它将被垃圾回收。
如果您为模块使用对象文字,则可以使用foo
限制范围。在以下示例中,this
函数引用模块的generateThing
字段。在执行期间,该值将在词法范围内可用。但是,如果创建内部函数,则上下文foo
将不同。因此,当您调用返回的函数时,它将输出this
。
您可以使用undefined
功能(以及其他功能)控制this
的上下文。通过使用apply
作为上下文调用函数,我们可以引用myModule
变量。
foo