继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

ES6初探let、const和块级作用域

dxj153
关注TA
已关注
手记 1
粉丝 1
获赞 0

在ES6语法中,let 和 const 是新的变量定义方法,其中const用于定义常量。

块级作用域

在ES6之前只有全局作用域和函数作用域。如下

var fn1 = function(){
    var num = 5;
}
fn1();
console.log(num);  //  报错:num未定义

var fn2 = function(){
    num = 5;
}
fn2();
console.log(num);  // 5

函数体内部会形成一个函数作用域,在没有任何作用域延伸的处理时,外层无法访问该变量。但是在执行 glo 函数时,num未声明,自动声明为全局变量,作用域为全局作用域,所以可以输出 num 为 5。

使用 let 形成块级作用域通常可以在大括号 {...}里使用, 外层作用域无法读取内层作用域的内容。

'use strict';
function foo (){
    if(true){
        let i = 0;
        console.log(i);
    }
    console.log(i);    // 不能读取 if 里面的 i
}
foo();  //  0  报错:i 未定义
let定义变量

let 定义的变量的的作用域限定在块级,但是使用 var 定义的变量不存在块级作用域,比如将上面代码中的 let 换成 var

'use strict';
function foo (){
    if(true){
        var i = 0;
        console.log(i);
    }
    console.log(i);
}
foo();  //  0  0

在 for 循环中,使用var定义的循环变量 i 存在于 for 循环的上层作用域中,这对于我们编程可能会带来一定的困扰。

var arr = [1,2,3,4,5];
var sum = 0;
for(var i = 0;i < arr.length;i++){
    sum += arr[i];
}
// for 循环外依然可以获取到 i 的值
console.log(i);  //  5

使用 let 定义循环变量就完美的避开了这个问题

var arr = [1,2,3,4,5];
var sum = 0;
for(let i = 0;i < arr.length;i++){
    sum += arr[i];
}
// let 只能作用于循环内部
console.log(i);  //  报错:i 未定义

注意:同一作用域下, 不可使用 let 重复声明变量。

const定义常量

使用 const 定义常量,声明后必须要赋值,否则会报错

//定义一个常量
const age = 20;
//该常量不能重新赋值
age = 25; // 报错:不能赋值给常量

于 let 相同,const 的作用域也限定在块级,而且不可重复声明

var fn = function(){
    if(true){
        const name = "小明";
        console.log(name);  //  小明
    }
    console.log(name);  //  不报错但是没输出
}
fn();

const 定义常量的原理是阻隔变量名所对应的内存地址被改变。所以定义的值在某些情况下也不是不可变

const myArr = [0,1,2];
console.log(myArr);  //  [ 0,1,2]
myArr.push(3);
console.log(myArr);  //  [0,1,2,3]

想要获得一个值不可变的对象就要用到 Object.freeze() 方法了

const myArr = Object.freeze([0,1,2]);
myArr.push(3);  //  这里就会报错啦

如果哪里写错了,希望大家批评指正

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP