关于javascript:Javascript笔记varletconst的异同

41次阅读

共计 1795 个字符,预计需要花费 5 分钟才能阅读完成。

一、问题的提出
在学习 js 的过程中,很多小伙伴会理解变量的知识点。其实每个变量只是更好的表白数据的占位符。在 ECMAScript 中,有三个关键字能够申明变量:var,const 和 let。

然而为什么简简单单的申明变量还须要三个关键字呢?他们有什么异同呢?

二、呈现工夫的不同
通过查问材料咱们发现,let、const 两个变量只能在 ES6 以及更晚的版本中应用,var 在 ES 的所有版本中均可应用。集体了解为 let 和 const 两个变量是对于 var 毛病的补充。

三、三者区别
节约工夫,先说后果再说起因!!

var

全局作用域、函数作用域。

同一作用域下,能够屡次申明同一变量(能够在后续代码中从新赋值)。

能够在申明前调用(先调用后申明)。

let

作用域:全局作用域、函数作用域、块级作用域。

同一作用域下,不能够屡次申明同一变量。

不能够在申明前调用。

const

作用域:全局作用域、函数作用域、块级作用域。

同一作用域下,不能够屡次申明同一变量。

不能够在申明前调用。

由此可见

const 的行为与 let 基本相同,惟一一个重要的区别是用它申明变量时必须同时初始化变量,且
尝试批改 const 申明的变量会导致运行时谬误。而 var 只能用于全局作用域和函数作用域。
刚刚提到了一个名词叫块级作用域,指的范畴是:

循环
判断
同一级 {} 外面的货色
上面咱们来详解一下这些关键字吧~~

四、详解关键字
var 关键字
1.1 var 关键字

此处是对于 var 的函数作用域的展现,在办法中申明的 var 变量,只对于该办法外部起到成果。

function Test() {var a = "hi"; // 局部变量} 
test(); 
console.log(a); // 出错!

解决此类问题,能够抹去 var 变量,间接定义一个全局变量如下 , 不过个别不举荐这么做,会造成困惑,保护起来也麻烦。

function test() {a = "hello world"; // 局部变量} 
test(); 
console.log(a); // "hello world"
 1.2   var 申明的晋升

这一条看起来就很诡异,在作用域内先输入变量,再定义的模式,在 Js 中不会报错,因为申明的变量会主动提到函数作用域顶部

举个例子:

function foo() {console.log(score); 
 var score = 26; 
} 
foo(); // undefined
这个代码中,先输入了 score,之后才进行赋值。

这里是因为在 ES 运行时,会主动把所有关键字 var 申明的变量放在顶部。然而此时未赋值。所以输入 undefined。在解决的过程中,ES 把上述代码等同于:

 var score; 
 console.log(score); 
 score = 26; 
} 
foo(); // undefined

这就是 var 的申明晋升

let 关键字
1.let 关键字的作用域

说到 let,不可避免的肯定要提到块级作用域,前文中提到,能够近似的了解为对立对 {} 外面的内容。

写个代码跑跑看吧

// 首先咱们能够先写个 var,比照一下
if(true){
    var name = "xiaotian"
    console.log(name)  //"xiaotian"
}
    console.log(name)  //"xiaotian"
// 如果此时用的是 let 呢?if(true){
    let name = "xiaotian"
    console.log(name)  //"xiaotian"
}

console.log(name)  //ReferenceError.age 没有定义

由此可见,let 只在代码的作用域内起到作用。而 var 能够在全局起到作用。值得注意的是,这里用到的是 if 语句,并非上文中提到的函数作用域 function()。所以 var 定义的数值能够传出。

值得注意的是 let 和 var 不同的作用域,即函数嵌套应用,能够反复定义 let 和 var。

2. 申明范畴

var 会成为 windows 对象的属性,然而 let 不会

3. 条件

前文提到,var 申明的变量能够被晋升,在顶部定义。但 let 只作用于块作用域,无奈查看是否曾经应用过 let 申明雷同变量。同样也不能在申明前被调用。

const 关键词
这个关键字和 let 用法很类似,然而循环过程中有一种报错模式,此处时因为迭代变量会自增:

for (const i = 0; i < 10; ++i) {} // TypeError:给常量赋值

综上所述

var 因为作用域太过于宽泛,容易在应用过程中呈现问题,let 和 const 会好很多,也更易于定位谬误。

正文完
 0