亲宝软件园·资讯

展开

JavaScript let与const命令

猪痞恶霸 人气:0

let命令

基本使用

let是ES6中新增的声明变量的命令,但是和var不同let不可以被重复声明let只在其命令的代码块有效let禁止变量出现变量提升现象,let会通过暂时性死区的方式来避免程序上的错误

适用场景

letvar根据其各自不同的特点有着不同的适用场景

块级作用域

ES6新增了块级作用域,此前ES5只有全局作用域函数作用域

概念

块级作用域的出现其实是由新增声明let产生的

let n = 5
function fn() {
    if(true) {
        let n = 10
    }
    console.log(n)
}
fn() // 5

上面的例子诠释了块级作用域的作用,即外层代码块不受内层代码块的影响,我们在if函数体内声明的n只有在if函数体内可以访问,而fn中访问n不受if内层的声明影响。

存在意义

var tmp = new Date();
function fn() {
    console.log(tmp);
    if(false) {
        var tmp = 'hello world'
    }
}
fn()

如上,存在函数作用域全局作用域,正常情况下fn()函数体内if函数体外是使用外层即var tmp = new Date();但是由于变量提升现象的存在即if函数体内的var tmp = 'hello world'发生了变量提升,即fn()函数体内的编译形式如下,所以输出结果为undefined

function fn() {
    var tmp
    console.log(tmp);
    tmp = 'hello world'
}

块级作用域正是解决了这个问题

let n = 5
function fn() {
    if(true) {
        let n = 10
    }
    console.log(n)
}
fn() // 5

除此之外还可以防止局部作用域变量的泄露到全局当中

let arr = [1,2,3]
for(var i = 0; i < arr.length; i++) {
    console.log(arr[i])
}
{
  console.log(i) // 3
}

如上就造成了变量泄露,i变量被泄露到了全局当中,那么我们使用块级作用域来看一看i is not defined,说明变量未被泄露到全局中。

let arr = [1,2,3]
for(let i = 0; i < arr.length; i++) {
    console.log(arr[i])
}
console.log(i) // i is not defined

const命令

基本使用

const声明的变量无法被再次赋值改变,且声明的时候必须赋值

const name = '猪痞恶霸'
name = 'fzf404' // Assignment to constant variable.
const name // Missing initializer in const declaration
name = '猪痞恶霸'

constlet的特性很像,比如只在其声明的块级作用域内有效,存在暂时性死区

不可被const的情况

javascript中有两种数据类型即:简单数据类型复杂数据类型

简单数据类型:数值,字符串,布尔值

复杂数据类型:数组,对象

引出数据类型的原因正是因为两种数据类型的访问方式不同,简单数据类型的值直接保存变量所指向的内存地址,直接访问就可以拿到值而复杂数据类型的访问是通过变量指向的内存地址,内存地址保存的是另一个指针(引用)

const声明是通过保证变量所指向的那个内存地址不能改动,所有说使用const声明复杂数据类型,会出现数组的元素和对象的属性可以发生改变

const person = {}
person.name = "猪痞恶霸"
console.log(person.name) // 猪痞恶霸

如果我们想要使我们的对象不可以发生改变那么我们可以使用Object.freeze方法,详细使用参考这篇文章:冻结JS对象方法技术详解

加载全部内容

相关教程
猜你喜欢
用户评论