共计 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 会好很多,也更易于定位谬误。