这个es5代码做了什么,为什么它说阻止范围'?

时间:2016-06-03 02:36:56

标签: javascript

这个es5代码用什么来模拟es6 const?

特别是评论没有意义,因为es5中没有块范围。

http://es6-features.org/#Constants

//  only in ES5 through the help of object properties
//  and only in global context and not in a block scope
Object.defineProperty(typeof global === "object" ? global : window, "PI", {
    value:        3.141593,
    enumerable:   true,
    writable:     false,
    configurable: false
})
PI > 3.0;

2 个答案:

答案 0 :(得分:1)

typeof global === "object" ? global : window

这是说这个的快捷方式,(基本上)

var tmp;
if (typeof global  === "object") {
  tmp = global;
} else {
  tmp = window;
}

Object.defineProperty(tmp, "PI",

由于没有窗口,因此运行JavaScript的环境(例如节点)没有window属性。这允许您创建一个名为global的全局变量,如果它存在,它将使用该变量。如果它不存在,则默认尝试window

然后它在名为PI

的全局对象(无论名称)上创建一个属性

其他细节可在此处阅读:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

答案 1 :(得分:1)

  

这个es5代码是什么

它创建一个只读的全局变量。

  

特别是评论没有意义,因为es5中没有块范围。

这些评论是为了明确指出我们与ES6 EditorTemplate的差异:

  • 您只能在全局环境中创建只读“变量”,因为只有全局环境由对象支持(嗯,const环境,但无论如何都使用它)。 OTOH,with适用于任何环境。
  • const不同,这样创建的变量不会被阻止作用域。

换句话说,此代码尽可能接近const功能。