21 | (0, eval)("x = 100") :一行让严格模式形同虚设的破坏性设计(下)
该思维导图由 AI 生成,仅供参考
在全局环境中的 eval
- 深入了解
- 翻译
- 解释
- 总结
JavaScript严格模式并非一种特定的“严格模式环境”,而是对代码执行过程的限制。全局环境中执行代码可能带来问题,对eval()函数的使用也进行了详细讨论。严格模式的实质是对代码执行过程的限制,而非一种环境模式。文章解释了严格模式的实现方式,包括在可执行对象创建或初始化阶段处理大部分严格模式特性,以及在语法分析阶段识别和处理部分特性。在讨论eval()调用时,文章提到了直接调用和间接调用的区别,以及在间接调用中的严格模式处理方式。文章还解释了标题中的代码为何是一种间接调用。总的来说,文章涉及了JavaScript严格模式的技术特点,对于读者快速了解文章概览具有一定的参考价值。 在文章中,还对eval()的返回结果进行了讨论,指出eval(x)将返回语句执行的结果,而不返回引用。此外,文章还提到了间接调用对“严格模式”的绕过机制,以及间接调用的实用意义和对系统的潜在威胁。最后,留下了一个思考题,让读者尝试找出一例豁免案例,即直接调用eval()的写法。 总的来说,本文深入探讨了JavaScript严格模式和eval()函数的技术特点,对于读者快速了解这些内容具有一定的参考价值。
《JavaScript 核心原理解析》,新⼈⾸单¥59
全部留言(7)
- 最新
- 精选
- 海绵薇薇老师好: 一开始我并不能理解函数中的eval是一个环境引用(一开始以为必须要全局环境引用 ): function a () { var eval = global.eval } 这里的eval是一个环境引用,但是却和global.eval不是一个引用,因为 eval = global.eval 将右边的值赋值给左边的引用,所以eval是一个引用存储了global.eval这个 引用的值。 也就是说eval是一个引用但是并不是global.eval这个引用,是函数环境引用。 所以eval要求的是环境引用并不要求全局环境引用。 另,环境可以分为四种:全局环境,对象环境,模块环境和eval环境。 另,eval的名字一定要是eval 根据上面两个直接调用eval的条件,能想到的还有如下两个额外的豁免方法。 第一(在当前环境中): try { throw eval } catch (eval) { let e = 1; eval("console.log(e)") } 第二(在eval环境中): eval("let e = 1; eval(console.log(e)) ")
作者回复: 对的。你现在的理解就是对的。而且catch()这个豁免方法是完全出乎我意料的,但也是对的。赞~ ~ 不过通常不要叫“环境引用”,就是“环境”而已,“环境(Environment)”是一个规范类型,它跟“引用(Reference)规范类型”一样,都是ECMAScript中的、同一级别的东东。
2020-09-057 - 行问2020 年好! 立一个 flag,今年要把您的书和专栏学习 2 次,不是阅读,是学习。虽然有很多的不懂,持续学习,不断积累。 也公布下本年度的 flag,有兴趣的小伙伴可以来共勉:2020 年做到 80% 以上的每一天 5:28 起床、23:00 前睡觉(2019 年只做到大概 50%,惭愧)
作者回复: ...... 给新年计划点赞! 我已经保持大概(或至少)20年的习惯,大概是每天3:00前后睡了。 不过这不是好习惯,不值得推广……
2020-01-0123 - kittyEvar arr = [] var x = 100 arr[0] = eval (arr[0])(x) 属性引用仍然是间接调用,我这样理解对吗
作者回复: 是的。
2020-01-011 - qqq(0, eval)('this.eval("b = 1")')
作者回复: 这个可没有被豁免,"b = 1"仍然是被间接调用的eval执行的。
2020-01-02 - K4SHIFZ规范18.2.1.1章: Runtime Semantics: PerformEval ( x, evalRealm, strictCaller, direct ) ... 12.NOTE: If direct is true, ctx will be the execution context that performed the direct eval. If direct is false, ctx will be the execution context for the invocation of the eval function. 13.If direct is true, then Let lexEnv be NewDeclarativeEnvironment(ctx's LexicalEnvironment). Let varEnv be ctx's VariableEnvironment. 14.Else, Let lexEnv be NewDeclarativeEnvironment(evalRealm.[[GlobalEnv]]). Let varEnv be evalRealm.[[GlobalEnv]]. 15.If strictEval is true, set varEnv to lexEnv. ...2020-02-052
- qqq(eval.valueOf())('a = 1')2021-03-26
- undefined转眼这个课程一年了,还没有学完。 最近开始重新翻出来学习,搭配书籍一块儿消化下。2021-03-15