美文网首页
ES6探索2

ES6探索2

作者: cajan2 | 来源:发表于2016-08-14 10:45 被阅读30次

let和const

块级作用域:es6和es5的差异

很显然,这种行为差异会对老代码产生很大影响。为了减轻因此产生的不兼容问题,ES6在附录B里面规定,浏览器的实现可以不遵守上面的规定,有自己的行为方式

  • 允许在块级作用域内声明函数。
  • 函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
  • 同时,函数声明还会提升到所在的块级作用域的头部。

注意,上面三条规则只对ES6的浏览器实现有效,其他环境的实现不用遵守,还是将块级作用域的函数声明当作let处理。

考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。

// 函数声明语句
{ 
  let a = 'secret'; 
  function f() { return a; }
}
// 函数表达式
{ 
  let a = 'secret'; 
  let f = function () { return a; };
}

全局对象的属性

全局对象是最顶层的对象,在浏览器环境指的是window
对象,在Node.js指的是global对象。ES5之中,全局对象的属性与全局变量是等价的。
未声明的全局变量,自动成为全局对象window的属性,这被认为是JavaScript语言最大的设计败笔之一。这样的设计带来了两个很大的问题,首先是没法在编译时就报出变量未声明的错误,只有运行时才能知道,其次程序员很容易不知不觉地就创建了全局变量(比如打字出错)。另一方面,从语义上讲,语言的顶层对象是一个有实体含义的对象,也是不合适的。
ES6为了改变这一点,一方面规定,为了保持兼容性,var
命令和function命令声明的全局变量,依旧是全局对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于全局对象的属性。也就是说,从ES6开始,全局变量将逐步与全局对象的属性脱钩。
对于node来说,模块环境之中,全局变量必须显式声明成global对象的属性。

var a = 1;
// 如果在Node的REPL环境,可以写成global.a
// 或者采用通用方法,写成this.a
window.a // 1
let b = 1;
window.b // undefined

相关文章

  • ES6探索2

    let和const 块级作用域:es6和es5的差异 很显然,这种行为差异会对老代码产生很大影响。为了减轻因此产生...

  • Cycript

    简介 1.Cycript是Object-C++,ES6,Java等语法的混合物 2.可以用来探索,修改,调试正在运...

  • 05_Cycript

    Cycript是Objective-C++、ES6(JavaScript)、Java等语法的混合物 可以用来探索、...

  • ES6探索1

    ECMAScript 6 入门 备忘录: windows下面的nvmw和nvm windows支持的不好了(nvm...

  • ES6(3)、参数处理

    1、默认参数值 (1)、ES6之前: (2)、ES6改成:范例1: 范例2: 2、剩余参数 语法: 范例1: 范例...

  • 二、逆向开发_Cycript

    Cycript 是Object-C++、ES6(JavaScript)、Java等语法的混合物作用:可以用来探索、...

  • es6新特性

    es6新特性 1.函数参数添加默认值 es6之前 es6之后: 2.字符串拼接 es6之前: es6之后: 3.解...

  • es6 async与await的使用

    fs读取文件 es5 es6写法1 es6写法2

  • IOS逆向_Cycript、PS的简单使用

    Cycript: 是Object-C++、ES6、Java等语法混合的产物,主要用来调试、探索MAC/IPhone...

  • JS数组去重

    1、ES6语法filter()去重 2、ES6语法new Set()去重

网友评论

      本文标题:ES6探索2

      本文链接:https://www.haomeiwen.com/subject/lzeysttx.html