let/const

  • let 声明的变量
  • const 声明的也是变量 [只不过不允许重定向变量的指针,不能从新赋值]
    • 变量 -> 名字:存储值
    • 常量 -> 具体值

var/let

  • let 不存在变量提升
  • let 不允许重复声明 (在当前上下文中,不论基于什么方式声明了这个变量,再次基于let/const声明都会报错从父声明)
  • 全局上下文中,基于var声明的变量不是存放在VO(G)中的,而是直接放在了GO(window)中, 基于let声明的变量是存放在VO(G)中的
  • 暂时性死区
  • 块级作用域:没有es6之前,,,如果{}(排除函数和对象的大括号)中出现let/const/function,则当前的{}会形成一个块级私有的上下文

ES6中的正常循环,想让性能更优
let arr = [10,20,30]
let i = 0,
len = arr.legngth
for(; i < len; i++){}

循环绑定事件:用var的方式实现
var buttons = document.querySelcetorAll(‘button’)
for(var i = 0; i < buttons.length; i++){
(function(i){
buttons[i].onclick = function(){
alert(i);
}
})(i)
}

解决2 自定义属性
let buttons = document.querySelcetorAll(‘button’),
i= 0;
len = buttons.length;
for(; i < len; i++){

buttons[i].index = i;
buttons[i].onclick = function(){
alert(i);
}

}

解决3:事件委托:
document.body.onclick = function(ev){
let target = ev.target;
if(target.tarName === ‘BUTTON’){
// 点击
alert(target.getAttribute(‘index’))
}
}

js代码执行

  • 词法解析(AST)我们基于http从服务器拉取回来的js代码其实是一些字符串,浏览器首先会按照ECMAScript规则,把字符串变为c++ 可以识别和解析的一套树结构对象
  • 变量提升
  • 代码执行

var x = 10;
var x = 20;
console.log(x)

全局上下文查找变量【机制】

  • 先查找VO(G)中是否存在,如果存在就用这个全局变量

  • +