流浪人

导航

学习ES6--data1

在ES6之前,ES5没有块级作用域,没有继承,只有函数作用域,这些导致ES5会变量提升,和函数提升,例(如有错误,请指正):
function test() {
  var name = 'test'

  this.export = function() {
      return 'test1'
  }
  this.name = 'test2'
}

var demo = new test()

// 这里的因为变量声明在构造函数内,构造函数相当于一个块级作用域,在里面声明的变量外部不能访问
//console.log(name); 
//此时可以访问,相当于暴露对外接口
console.log(demo.name);


// js中可以把构造函数当作参数返回
console.log(demo.export());

var name = "Window"
var object = {
    name: "My object",
    getName: function() {
      return function() {
        return this.name
      }
    }
}
// 此时输出的不是My object 而是Window,匿名函数会提升到全局环境中,
// 跟arguments和caller、callee有关,他此时执行的对象是Window对象
console.log(object.getName()());

  ES6的出现是应时而生,是必须的,在ES4的提案中,早就存在ES6的身影,因为过渡太过于激进,最终越过ES4而有了ES5,而ES5跟ES3大径相同。学习ES6是趋势和未来,而且ES7也将会被主流浏览器慢慢支持,一个语言的强大在于它的跨平台能力,我相信javascript肯定会越来越好。进入正题

  ES6中新增了let命令,来声明变量,它仅仅在当前作用域有效:

for (var i = 0; i < 5; i++) {
  
}

console.log(i); // i = 5

for (let j = 0; j < 5; j++) {
  
}

console.log(j); // undefined

  在ES5中var i 虽然未在全局环境中声明,但是由于ES5可以先用后声明,变量会自动提升到全局中或者局部全局中,所以此时输出的是5。而在ES6中let的作用非常明显,仅仅在当前块级作用域中起作用,用完即销毁。还有一点需要注意的是,在let使用的块级作用域内,会形成一个封闭的作用域,如果在外部已经声明了一个变量test,但是在一个封闭的作用域内再次使用test,且let test声明在使用之后将会报错,例:

var  test = "sss"

function demo() {
  test = "sssd"
  let test
}

  注,在块级作用域内,不适宜使用声明函数,最好用函数表达式,这跟ES5的规定有关,规定函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。

  还有一个就是const 常量声明后即不能修改,跟let的效果一样,仅在当前作用域有效

 

posted on 2016-08-22 21:07  李毅鹏  阅读(335)  评论(0编辑  收藏  举报