作用域--欺骗词法

本文章引用《你所不知道的Javascript》

代码如下:

(1)eval

function foo(str,a){eval(str);console.log(a,b);} var b = 2; foo("var b=3;",1);

运行结果如下:1 3

以上代码,eval()通过动态创建代码修改作用域,从而改变了b的作用域。

通过以上例子,我们可以发现一些动态创建代码的方法

setTimeout(),setInterval()的第一个参数可以是字符串。

new Function(),第一个参数作为创建代码的形参,稍微安全些。

由于动态生成代码生成的场景罕见,所以无法抵消洗性能上的损耗。

(2)with

with是重复引用同一个对象中多个属性的快捷方式,可以不需要重复引用对象本身。

代码

function foo(obj){with(obj){a =2}}  var o1 = {a:3}; var o2={b:3};foo(o1);  console.log(o1.a);console.log(o2.a)  console.log(a)

运行结果

2   undefined   2(被全局引用了)

运行结果前两个代表当前作用域里是否包含此属性。最后查找a的作用域的时候,全局查找执行到a=2,就自动创建了一个全局变量。

总结:

通过以上两种欺骗词法我们可以看出,eval和with都可以间接改变一些字段的作用域。严格模式下,禁止使用这两种方式。

那为什么会影响性能呢?

解释如下:

Javascript 引擎会在编译阶段进行熟项的性能优化,比如:对词法进行静态分析,确定所有变量和函数定义的位置。

可以看出eval,with对于以上定义是无效的,同时也无法确定作用域是什么。所以运行会变得很慢。------不要使用它们

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、理解js作用域 1、作用域:作用域是一套规则,用于确定在何处以及如何查找变量(标字符)。2、LHS查询:查找的...
    怀念不能阅读 518评论 0 1
  • 官方中文版原文链接 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大...
    HetfieldJoe阅读 2,480评论 0 11
  • 特别说明,为便于查阅,文章转自https://github.com/getify/You-Dont-Know-JS...
    杀破狼real阅读 628评论 0 3
  • 词法作用域 定义在词法阶段的作用域。简单来说就是函数,对象在定义时就决定好的执行范围,由代码书写的地方决定一切。 ...
    _MChao阅读 1,377评论 0 1
  • 上阙:梦里花开满圃,问夜香枝何处?钗钿蒙尘铜镜古,女子不再此妆梳。与谁亲慕?远方画眉酥。 下阙:秋懒闲靠椅扶,无月...
    木土有阿杜阅读 223评论 0 0

友情链接更多精彩内容