如何创建不继承词法范围的函数expr?

时间:2016-05-03 08:12:30

标签: javascript

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

(function() {
  return new Function('return function Thing() {}');
}());

但是这个替代方案继承了它的父范围:

(function() {
  var foo = '42';
  return function Thing() {};
}());

我相信这会阻止foo被垃圾收集。

有没有办法在全局范围内放置一个函数定义(请注意,我并不是指在全局范围内访问它,我的意思是它的定义存在于全局范围内),如果您只限于在内部编写代码IIFE?

1 个答案:

答案 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