How efficient is the "with" statement?
How efficient is the "with" statement?
很难在谷歌上搜索一些关键词,比如"with"word,所以我在这里测试询问。
JavaScript中的with语句是否效率低下?
例如,假设我有:
with(obj3) {
with(obj2) {
with(obj1) {
with(obj0) {
eval("(function() { console.log(aproperty) })();");
}
}
}
}
例如,如果我遍历obj0、obj1、obj2、obj3并将它们合并在一起,然后使用其中一个:
- 一个单独声明
创建了一个参数字符串,其中包含obj0、obj1、obj2和obj3键,以及值的args数组,并使用:
eval("function fn(aproperty, bproperty) { console.log(aproperty); }") fn.apply(undefined, args);
这三种方法中哪一种可以被认为更快?我一直在猜测语句,但有这么多语句让我觉得我可以进一步优化它。
如果您正在寻找选项,那么您可能需要考虑第三种方法,即创建(如果需要,可以动态创建)对象的原型链。
编辑:我的解决方案被破坏了。它要求非标准的__proto__
属性。我正在更新以修复它,但请注意,并非所有环境都支持此功能
var objs = [null,obj3,obj2,obj1,obj0];
for (var i = 1; i < objs.length; i++) {
objs[i].__proto__ = Object.create(objs[i-1]);
}
var result = objs.pop();
这避免了with
,并且应该比合并更快,尽管只有测试才能说明问题。
然后,如果你所需要的只是某种性质的产品,这将是非常快的。
var props = ["x2","b1","a3"];
var product = result.y3;
for (var i = 0; i < props.length; i++)
product *= result[props[i]];
较新的浏览器有一个内部标记机制,可以使javascript解释更便宜。它非常像新JVM中的JIT。我认为你的深度嵌入没有太大问题,实际上它会像一样
__get_aproperty() {
if (obj0.has("aproperty")) return obj0.aproperty;
if (obj1.has("aproperty")) return obj1.aproperty;
if (obj2.has("aproperty")) return obj2.aproperty;
if (obj3.has("aproperty")) return obj3.aproperty;
}
因此,js的结构是高度嵌入的,但浏览器的js引擎中实际执行的结构将是简单和线性的。
但是JS的标记化是昂贵的。如果JS引擎找到一个eval,则需要标记化。
我投票支持第一个版本。
With语句将使您的代码像1980年一样运行——实际上,JIT中实现的每一个优化在生效时都无法使用。
相关文章:
- 铬:“;未捕获的语法错误:意外的标记:"
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- 检测电话窃听,即:<a href="电话:xxx">在UIWebview上
- 使用“+="操作人员
- //而不是在src=“”上使用http://"属性
- "未捕获的语法错误:意外的标记}"
- 可以<脚本类型=“;text/javascript”>window.location=“/"</
- "实例范围”;TypeScript类的getter/setter
- Javascript复选框函数:;缺少:在属性id之后"
- "“;变量未引用正确的对象
- "日期“;AJAX请求返回的类型值未定义
- 得到"TypeError:无法读取属性'filename'未定义的“;调用“npm start
- Soundcloud api"未捕获的类型错误:无法读取属性'uri'“未定义”;
- "工具提示"jQuery插件坏了
- "锻造;React中的表达式
- 图像可以从源<img src=""/>.TEXT可以在没有javascript的情况下从外部
- 如何提取“;href"最近列表项中的属性值
- CKEditor如何允许href="javascript:void(0)"在小部件中
- 插入“;img src"在javascript中