June 25,2020
ES6中一共有6种声明变量的方法:let
const
class
import
var
function
主要看一下let
// var 声明
var a = []
for(var i = 0;i<10;i++){
a[i] = function(){
console.log(i)
}
}
a[6]() // 10
// let 声明
var b = []
for(let i = 0;i<10;i++){
b[i] = function(){
console.log(i)
}
}
b[6]() // 6
这个很容易理解,不详细说了
只要块级作用域内存在let命令,它所声明的变量就绑定在这个区域,不在受外部影响
let name = 'outer'
function showName(){
console.log(name)
let name = 'inner'
}
name = 'updateOuter'
showName() //ReferenceError: Cannot access 'name' before initialization
var name1 = 'outer'
function showName1(){
console.log(name1)
var name1 = 'inner'
}
name1 = 'updateOuter'
showName1() // undefined
全局对象的属性,ES5中全局对象就是最顶层的对象,在浏览器环境指的是window对象,在Node.js环境指的是glabal对象。ES6规定,var
,function
命令声明的全局变量依旧是全局对象的属性;let
,const
,class
命令声明的全局变量不属于全局对象的属性。
var c = 1
console.log(this.c) // 1
let d = 1
console.log(this.d) // undefined
let len = 10;
function fn() {
console.info(this.len)
}
fn(); // undefined
let person = {
len: 5,
say: function() {
fn(); // undefined 这里还没弄清楚,等弄清楚了再解释
arguments[0](); // undefined 这里还没弄清楚,等弄清楚了再解释
}
}
person.say(fn);