javascript es6 新特性 var let const (一)
首先在学习 es6 新特性的时候,我们在来回顾一下 es5 的内容 在es5中只要两个作用域 分别为 全局作用域 和 函数作用域
全局作用域(在es5中 全局作用域 和 window 是挂钩的 )
var a = 1;
window.a = 2;
console.log(a); //2 var a === window.a
全局变量的声明方式有哪些呢?
在函数外部 使用 var 声明的变量 为 全局变量
var a = 1; // 全局变量
在 for(var i = 0; ;) 里面使用 var 声明的变量是全局变量
for(var i = 0; i < 5; i++){
}
console.log(i); //5
在 function 里面不使用 var 声明的变量为 全局变量
(function () { //一个立即执行的函数
b = 1;
})();
console.log(b); // 1
函数作用域(在函数内部使用 var 声明的变量)
function num(){
var c = 1;
console.log(c); //1
}
num();
console.log(c); // Uncaught ReferenceError: c is not defined
// 函数作用域 只能在函数内部可以访问
了解了 var 在 es5 中 的特性那么接下里我们来说说 es6 中新增的两个命令 let 和 const
首先我们来了解 let 命令的特性 let 和 var 类似 都是用来声明变量 但是 let 声明的变量它的作用域 只在 let 命令所在的代码块有效
{
let a = 1;
var b = 2;
}
console.log(a); //ReferenceError: a is not defined.console.log(b); // 2
当我们使用 for(var i =0;;) 来绑定事件的时候 最终的运行结果 和我们预想的有偏差 这是为什么呢?
var element = self.document.getElementByClassName("div"); // 假设 element 查找到 三个div 现在要给这三个div 添加点击事件
for(var i =0; i< element.length ; i++){
element[i].onclick = function(){
alert(i); //不管点击那个div 都出弹出3
}
}
当我们点击div 的时候发现不管点击那个div 都是弹出的 3 。
这是因为 变量i是var命令声明的,在全局范围内都有效,所以全局只有一个变量i。每一次循环,变量i的值都会发生改变,
而循环内被赋给数组a的函数内部的alert(i),里面的i指向的就是全局的i。也就是说,所有alert(i)里面的i,指向的都是同一个i,
导致运行时输出的是最后一轮的i的值,也就是 3。
而使用 let 在for 里面声明变量则没有这个问题
var element = self.document.getElementByClassName("div"); // 假设 element 查找到 三个div 现在要给这三个div 添加点击事件
for(let i =0; i< element.length ; i++){
element[i].onclick = function(){
alert(i); //弹出正常
}
}
这是因为变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,
你可能会疑惑,如果每一轮循环的变量i都是重新声明的,那它怎么知道上一轮循环的值,
从而计算出本轮循环的值?这是因为 JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。
变量提升
什么是变量提升呢?即变量可以在声明之前使用 他的值为 undefined 这种现象一般都发生在 使用 var 命令声明的变量
console.log(a); // undefined
var a = 1;
console.log(b); // 报错
let b = 1;
关于变量提示 现在有歧义 部分人认为 let const 不存在变量提示 而另外一部分人认为 let const 存在有变量提示 但没有初始化值 博主比较偏向后一种
未完待续...

浙公网安备 33010602011771号