2013-12-20 124 views
5
window.scope = 'global' 
Object.prototype.scope = 'object proto' 

console.log(scope); 

我在上面写简单的脚本来测试范围,但我得到了不同的结果,铬开发工具和jsfiddle。为什么相同的代码给出了不同的结果jsfiddle

  • 铬: '对象原';
  • jsfiddle:'global';

为什么?

+1

有趣。但是你想要做的实际事情是什么?我假设你知道比使用可枚举属性扩展Object.prototype更好,这是一种思想实验。 –

+0

无论如何,你得到的结果[在真实环境中](http:// jsbin .com/aniqurUh/1)(例如,像你没有链接的小提琴,而不是开发工具)是正确的结果。我并不完全惊讶于发现开发工具偶尔出现的奇怪现象。 –

回答

1

如果我是你的代码粘贴到浏览器一个新的HTML文档,视图,我得到global打印到控制台加载页面时。

当您将代码粘贴到DevTools控制台直接,您可以:

object proto 
undefined 

这是因为什么DevTools实际评估是下面的脚本(对我来说):

with ((console && console._commandLineAPI) || {}) { 
    window.scope = 'global' 
    Object.prototype.scope = 'object proto' 

    console.log(scope); 
} 

因此,通过使用with语句,将console添加到当前范围链中,该范围链与绑定scope变量。由于您在访问scope之前扩展了对象原型,因此在参考scope(实际上是指console.scope,归功于with语句)时会看到您的操作结果。

之所以有”输出的两行是显而易见的:第一,console.log被执行,因此该消息被印刷到控制台,则DevTools给你表达console.log这是没什么的结果(函数没有返回值)。

希望能为您澄清一些事情。

相关问题