为什么在浏览器环境上调用函数,可以提前看到调用结果?

比如我在chrome console上写了一行 console.log(“aaa”), 还没按回车就可以看到结果。这是什么原理呢?

作者:紫云飞 链接:https://www.zhihu.com/question/406157937/answer/1347038393 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

无论是回车前还是回车后的执行结果,都是通过 DevTools Protocol 的 Runtime.evaluate 方法拿到的,差别是前者多传了一个 throwOnSideEffect 参数,这个参数有两方面的作用,一方面是让代码在执行时尽量不要产生额外的副作用,还有就是副作用不可避免的情况就抛出异常,不执行。

我想起来在 Chrome 刚实现这个功能的时候我还有个疑问,在推特上咨询了 Chrome 的人 https://twitter.com/ziyunfei/status/994187246998781952 ,居然是18年。。。时间太快了。问题是这样的:

正则表达式是个需要反复微调的东西,在控制台上反复回车、上箭头、修改、回车是常见的行为,很是这个 Eager Evalution 功能的适用场景。在用正则提取字符串时,我个人习惯用字符串上的 match()方法 ,而另外一些人习惯使用正则对象上的方法 exec(),两者在没有/g时通常是等效的。某一天我就发现,用 match()方法的代码就没有执行预览,必须回车才行,而exec()就可以

我能想到的这里的副作用就是正则匹配操作可能会改变全局对象 RegExp身上的属性,但经过测试就能知道,该副作用 exec() 方法已经避免了,那 match()方法同样也应该能避免。

所以我才在推特上问,收到的解答是执行 match()方法可能会去调用到自定义的 Symbol.match这个 hook 函数

比如我直接举个极端点的例子,覆盖默认的 Symbol.match方法 RegExp.prototype[Symbol.match] = clear,执行 match()方法会让控制台清屏。

最后更新于

这有帮助吗?