2017-05-31 41 views
6

我正在运行Edge/15.15063。 'Can I Use' says const should work.const在Edge 15开发人员工具中不起作用

运行:

const x = 'woo' 

然后:

console.log(x) 

返回

'x' is undefined 

截图:

enter image description here

为什么不是const工作?

+1

它是否工作,如果你包装它'(function(){const x ='woo'; console.log(x);})();'? –

+0

如果你把它放在代码块中怎么办? '{const x ='woo';的console.log(X); }'? – evolutionxbox

+0

@jared:包装时工作 – mikemaccana

回答

2

我怀疑Edge控制台正在使用with语句,其覆盖范围为like other implementations did。这可以解释var S和even function declarations被外界提升到全球范围内,但letconst将被锁定成块范围:

with (…) { 
    const x = 'woo' 
} 
// next input: 
with (…) { 
    console.log(x) // obviously undeclared 
} 

尝试在多行模式下输入它们,在一个单一的评价 - 他们在那里应该工作。

但你可能还需要提交一个bug,作为控制台确实有望感觉像在全球范围内评估的事情。

+1

对于你连接到的几乎所有的答案的最后一个评论说:“几个星期前,我们把我们的控制台在Chrome中的实现从块转移到了一些符号魔术上,因为块阻塞了一些ES6特点:)“ –

+0

@JaredSmith哈,完美!没有仔细阅读它,我只是想链接任何显示实现方法的东西。 – Bergi

1

我想我明白了这一点,但这和答案一样多。太长的评论,但。

认为发生的事情是,在顶级的范围以同样的方式var不使用时constletdo not create隐含的全局变量。虽然使用constlet创建的顶级变量是全局变量,但它们不是全局对象的属性。

如果MS控制台依赖隐含的window属性创建来访问在控制台中创建的变量,那么constlet将不起作用。

我不确定Chrome开发工具的内部工作的,但它似乎建立在控制台执行的代码一个匿名函数包装:在匿名1个未被捕获的错误 :

throw new Error; 

VM679: 1:7

(function() { throw new Error; })(); 

VM759:以1个未被捕获的错误 nonymous:1:21 在匿名:1:33

我不确定是否有其他的沙箱会在这里,我也并不一定能找到大量的文档资料就可以了。

+0

“*如果MS控制台依赖隐式窗口属性创建访问变量*” - 为什么会这样? – Bergi

+0

@Bergi IDK它听起来也很愚蠢。正如我所说,猜测,但太长的评论。 –

+0

我现在发布了我自己的推测:-) – Bergi

相关问题