JavaScript核心原理解析
周爱民
《JavaScript语言精髓与编程实践》作者,南潮科技(Ruff)首席架构师
立即订阅
3726 人已学习
课程目录
已更新 26 讲 / 共 21 讲
0/3登录后,你可以任选3讲全文学习。
开篇词 (1讲)
开篇词 | 如何解决语言问题?
免费
从零开始:JavaScript语言是如何构建起来的 (5讲)
01 | delete 0:JavaScript中到底有什么是可以销毁的
02 | var x = y = 100:声明语句与语法改变了JavaScript语言核心性质
03 | a.x = a = {n:2}:一道被无数人无数次地解释过的经典面试题
04 | export default function() {}:你无法导出一个匿名函数表达式
05 | for (let x of [1,2,3]) ...:for循环并不比使用函数递归节省开销
从表达式到执行引擎:JavaScript是如何运行的 (6讲)
06 | x: break x; 搞懂如何在循环外使用break,方知语句执行真解
07 | `${1}`:详解JavaScript中特殊的可执行结构
08 | x => x:函数式语言的核心抽象:函数与表达式的同一性
09 | (...x):不是表达式、语句、函数,但它却能执行
10 | x = yield x:迭代过程的“函数式化”
11 | throw 1;:它在“最简单语法榜”上排名第三
从原型到类:JavaScript是如何一步步走向应用编程语言的 (6讲)
12 | 1 in 1..constructor:这行代码的结果值,既可能是true,也可能是false
13 | new X:从构造器到类,为你揭密对象构造的全程
14 | super.xxx():虽然直到ES10还是个半吊子实现,却也值得一讲
15 | return Object.create(new.target.prototype):做框架设计的基本功:写一个根类
16 | [a, b] = {a, b}:让你从一行代码看到对象的本质
17 | Object.setPrototypeOf(x, null):连Brendan Eich都认错,但null值还活着
从粗通到精通的进阶之路:唯一不变的是变化本身 (5讲)
18 | a + b:动态类型是灾难之源还是最好的特性?(上)
19 | a + b:动态类型是灾难之源还是最好的特性?(下)
20 | (0, eval)("x = 100") :一行让严格模式形同虚设的破坏性设计(上)
21 | (0, eval)("x = 100") :一行让严格模式形同虚设的破坏性设计(下)
22 | new Function('x = 100')();:函数的类化是对动态与静态系统的再次统一
不定期加餐 (3讲)
加餐 | 捡豆吃豆的学问(上):这门课讲的是什么?
免费
加餐 | 捡豆吃豆的学问(下):这门课该怎么学?
免费
加餐 | 让JavaScript运行起来
免费
JavaScript核心原理解析
登录|注册

21 | (0, eval)("x = 100") :一行让严格模式形同虚设的破坏性设计(下)

周爱民 2020-01-01
你好,我是周爱民。欢迎回到我的专栏。书接上回,这一讲我们仍然讲动态执行。
之前我说到过,setTimeout 和 setInterval 的第一个参数可以使用字符串,那么如果这个参数使用字符串的话,代码将会在哪里执行呢?毕竟当定时器被触发的时候,程序的执行流程“很可能”已经离开了当前的上下文环境,而切换到未知的地方去了。
所以,的确如你所猜测的那样,如果采用这种方式来执行代码,那么代码片断将在全局环境中执行。并且,这也是后来这一功能被部分限制了的原因,例如你在某些版本的 Firefox 中这样做,那么你可能会得到如下的错误提示:
> setTimeout('alert("HI")', 1000)
Content Security Policy: The page’s settings blocked the loading of a resource at eval (“script-src”).
在全局环境中执行代码所带来的问题远远不止于此,接下来,我们就从这个问题开始谈起。

在全局环境中的 eval

早期的 JavaScript 是应用于浏览器环境中的,因此,当网页中使用<SCRIPT>标签加载.js 文件时候,代码就会在浏览器的全局环境中执行。但这个过程是同步的,将 BLOCK 掉整个网页的装载进度,因此有了defer这个属性来指示代码异步加载,将这个加载过程延迟到网页初始化结束之后。不过即使如此,JavaScript 代码仍然是执行在全局环境中的。
在那个时代,<SCRIPT>标签还支持forevent属性,用于指定将 JavaScript 代码绑定给指定的 HTML 元素或事件响应。当采用这种方式的时候,代码还是在全局环境中执行,只不过可能初始化为一个函数(的回调),并且this指向元素或事件。很不幸,有许多浏览器并不实现这些特性,尤其是for属性,它也许在 IE 中还存在,这一特性与 ActiveXObject 的集成有关。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《JavaScript核心原理解析》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(4)

  • kittyE
    var arr = []
    var x = 100
    arr[0] = eval
    (arr[0])(x)

    属性引用仍然是间接调用,我这样理解对吗

    作者回复: 是的。

    2020-01-01
    1
  • qqq
    (0, eval)('this.eval("b = 1")')

    作者回复: 这个可没有被豁免,"b = 1"仍然是被间接调用的eval执行的。

    2020-01-02
  • K4SHIFZ
    第一步:If direct is true, then
    Let lexEnv be NewDeclarativeEnvironment(ctx's LexicalEnvironment).
    Let varEnv be ctx's VariableEnvironment.
    第二步:Else,
    Let lexEnv be NewDeclarativeEnvironment(evalRealm.[[GlobalEnv]]).
    Let varEnv be evalRealm.[[GlobalEnv]].

    作者回复: 是的。^^.

    赞+1

    2020-01-01
  • 行问
    2020 年好!

    立一个 flag,今年要把您的书和专栏学习 2 次,不是阅读,是学习。虽然有很多的不懂,持续学习,不断积累。

    也公布下本年度的 flag,有兴趣的小伙伴可以来共勉:2020 年做到 80% 以上的每一天 5:28 起床、23:00 前睡觉(2019 年只做到大概 50%,惭愧)

    作者回复: ...... 给新年计划点赞!

    我已经保持大概(或至少)20年的习惯,大概是每天3:00前后睡了。

    不过这不是好习惯,不值得推广……

    2020-01-01
收起评论
4
返回
顶部