关于ecmascript:let-与块级作用域

  • 块内变量内部无法访问

    if(true){
    let foo = "mcgee0731"
    }
    console.log(foo); //foo is not defined
    ...
    for(let i=0;i< 3;i++>){}
    console.log(i) //i is not defined
  • var对循环的影响

    for(var i=0;i< 3;i++){
    for(var i=0;i< 3;i++){ 
      console.log(i);
    }
    }
    //内层循环完后 `i = 3` 到外层循环时,无奈再进入。打印0,1,2三次而不是九次
    // 循环内处理事件时,事件内拜访计数器
    var events = [{},{},{}]
    for(var i=0;i< events.length;i++){
    events[i].onclick = function(){
      console.log(i)
    }
    }
    events[0].onclick() //无论哪一项输入都是3
  • 通过IIFE模式处理事件计数器绑定

    // 应用闭包解决变量
    var events = [{},{},{}]
    for(var i=0;i< events.length;i++){
    events[i].onclick = (function(i){
      return function(){
        console.log(i)
      }
    })(i)
    }
    events[0].onclick()  //0
  • 应用let 解决 for循环的问题

    for(let i=0;i< 3;i++){
    for(let i=0;i< 3;i++){ 
      console.log(i);
    }
    }
    ...
    var events = [{},{},{}]
    for(let i=0;i< events.length;i++){
    events[i].onclick = function(){
      console.log(i)
    }
    }
    events[0].onclick() //0
  • for循环内有两层作用域,咱们对上面的办法进行拆解
for(let i =0;i < 3;i++){
  let i = "foo"
  console.log(i);
}

拆解成...

let i =0; //这是for循环的作用域 
if(i<3){
  let i = "foo" //这个n是块内的n,
}
i++

会执行三次
  • 不存在变量晋升

    console.log(bar); // 报错ReferenceError
    let bar = 2;
  • 做一个小案例

每次都是在新词法作用域创立个str=””+每次的i

for(var i=0;i<1000;i++)
{
  let str = ""
  str+=i
}
  • 为什么须要块级作用域

    • 变量晋升导致报错
    • 外部变量泄露
    • 匿名立刻执行函数表达式(IIFE)不再必要了
  • 函数在块级作用域内

    • 容许在块级作用域内申明函数。
    • 函数申明相似于var,即会晋升到全局作用域或函数作用域的头部。
    • 同时,函数申明还会晋升到所在的块级作用域的头部。

const

  • 只读的常量。一旦申明,常量的值就不能扭转

    const PI = 3.1415;
    PI = 3;
  • const申明不赋值报错

    const obj 
  • const 对于对象,绑定对象的地址值并且无奈改变,地址值内的属性成员能够改。
  • ES2015申明的6种办法,var function let const import class
  • 主用const ,须要改变的用let, 不必var

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理