javascript - 从代码中删除 eval 函数的使用
问题描述
我最喜欢使用的一段代码是:
if (!(eval("this instanceof "+arguments.callee.name)))
return eval("new "+arguments.callee.name+"(...arguments)");
这段代码允许函数原型在设置时创建自己,就像将自己的结果作为常规函数一样。(删除了为函数原型键入“新”的要求)
但是,它使用 eval。有什么方法可以从中删除 eval 吗?
另外,有没有办法进一步缩短它?
解决方案
是的,没有必要在eval
那里。以下是您在现代环境中的做法(ES2015+):
function Example(...args) {
if (!new.target) {
return new Example(...args);
}
// ...use `args` here, possibly destructuring to local meaningful names e.g.:
const [first, second] = args;
// ...
}
这避免了使用eval
伪arguments
数组和also arguments.callee
,它们不应该被使用,并且在严格模式下是不允许的。(严格模式是模块和类中的默认模式,并且将是任何进一步添加到语言的新范围的默认模式。)
如果您愿意,可以继续使用arguments
伪数组:
function Example(first, second) {
if (!new.target) {
return new Example(...arguments);
}
// ...
}
FWIW,我强烈建议不要做这样的双重用途功能。相反,当您不想使用时,请考虑使用class
语法和函数:create
new
class Example {
constructor(biz, baz) {
// ...
}
static create(...args) {
return new Example(...args); // Or `return new this(...args);` or a couple of other choices.
}
}
如果您尝试这样做Example(1, 2)
,则会自动抛出错误,因为class
构造函数不能像普通函数一样被调用。您可以new
通过使用Example.create(1, 2)
来避免。
create
使用的版本this
避免显式命名构造函数:
static create(...args) {
return new this(...args);
}
这是有效的,因为当你这样做时Example.create(1, 2)
,在调用create
this
引用期间,Example.
但如果你Example.create
在没有确保它被绑定的情况下绕过它,它就不起作用。例如,const create = Example.create; create(1, 2);
会失败new this(...)
但会与new Example(..)
.
推荐阅读
- arrays - 为什么我的 *ngFor 显示两个空项目
- python - 函数给出错误 ValueError: list.remove(x): x not in list
- xml - 参考 pandas 数据框替换 XML 中的元素
- angular - 在用另一个版本构建的应用程序中使用用一个版本的 Angular 构建的 Angular 库是否安全?
- php - MySQL where NOT IN 除了其中一个
- android - macOS Catalina 10.15.4 - 谷歌地图不工作
- reactjs - 无法使用 redux 在 react-testing-utils 中进行基本测试
- ios - NSAttributedString 来自 UITextView 中的 UTF16 字符
- java - Android:收到后如何删除对firebase动态链接的引用?
- c# - 希望通过外部事件触发 C# 脚本的一部分