我怎样才能创建一个函数expr;t继承词法范围
How can I create a function expr that doesn't inherit lexical scope?
以下JavaScript违反CSP(如果CSP有默认设置):
(function() {
return new Function('return function Thing() {}');
}());
但这个替代方案继承了它的父范围:
(function() {
var foo = '42';
return function Thing() {};
}());
我相信这可以防止foo
被垃圾收集。
如果您被限制在IIFE中编写代码,有没有一种方法可以将函数定义放在全局范围内(请注意,我不是指在全局范围中访问它,我的意思是它的定义存在于全局范围中)?
我不太确定您在这里想要实现什么,因为您提供的代码没有任何实际用途。变量foo
将被创建和分配,函数Thing
将被返回,但一旦IIFE被执行,所有引用都将丢失,并将进行垃圾收集。
如果我把这个函数作为一个例子做得更有用一点,下面将生成thing
函数,并且变量foo
仍然存在,因为它是封闭的——参见闭包。
function generateThing() {
var foo = '42';
return function thing() {
console.log("thing:", foo)
};
}
var myThing = generateThing();
myThing();
如果您不在内部函数中引用foo
,那么该引用将不会得到维护,并且将被垃圾回收。
如果为模块使用对象文字,则可以使用this
来限制作用域。在以下示例中,generateThing
函数引用模块的foo
字段。在执行过程中,该值将在词法范围内可用。但是,如果您创建一个内部函数,上下文this
将有所不同。因此,当您调用返回的函数时,它将输出undefined
。
您可以使用apply
函数(以及其他函数)控制this
的上下文。通过调用以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
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 如何在JavaScript中将字符串转换为函数引用
- 用嵌套函数和默认函数定义函数
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- JQuery合并了keyup和focusout两个函数
- ES6构造函数返回基类的实例
- 监视函数从服务返回不起作用,但作用域函数起作用
- 我可以在json对象中添加一个函数吗
- AngularJS:我可以跳过函数参数回调吗
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- jquery点击函数select&取消选择
- 拨打'父亲'函数形式a'儿童'ReactJS中的组件
- Node.js v6.2.0类扩展不是函数错误
- 比较从函数和生成的日期对象
- jQuery中是否内置了任何字符串格式化函数
- 我怎样才能创建一个函数expr;t继承词法范围