【发布时间】:2018-06-12 18:55:11
【问题描述】:
此代码有效:
it.cb(h => {
console.log(h);
h.ctn();
});
it.cb(new Function(
'h', [
'console.log(h)',
'h.ctn()'
]
.join(';')
));
这两个测试用例基本相同。但是用这样的数组构造一个字符串很麻烦,而且你无法进行静态分析。所以我想做的是这样的:
it.cb(isolated(h => {
console.log(h);
h.ctn();
}));
其中 isolated 是一个辅助函数,类似于:
const isolated = function(fn){
const str = fn.toString();
const paramNames = getParamNames(str);
return new Function(...paramNames.concat(str));
};
最大的问题是Function.prototype.toString() 为您提供了整个功能。有谁知道从函数的字符串表示中获取函数体的好方法?
更新:PRoberts 询问这样做的目的是什么,目的很简单:
const foo = 3;
it.cb(isolated(h => {
console.log(foo); // this will throw "ReferenceError: foo is not defined"
h.ctn();
}));
【问题讨论】:
-
我很惊讶没有人问你为什么要这样做。这有什么用?
-
为什么不在stringify操作后使用正则表达式剪掉函数的内部?
-
@patrick 用于测试。独立的函数意味着你有一个干净的范围
-
我知道什么是独立函数,但你试图显式地做 v8 已经隐式做的事情似乎很奇怪。
-
@AlexanderMills 在编写函数时未引用外部范围内的任何变量,v8 将自动将其标记为隔离并应用相关优化。您可以通过在 Chrome 上的函数中设置断点来确认这一点。如果您这样做并查看断点处的可用范围,您将无法从函数范围内访问外部范围中的变量值,因为 v8 在 JIT 编译期间将该函数标记为隔离。
标签: javascript node.js