一、var关键字
/* This variable has a global scope, it's accessible everywhere */
var greeting = "Hello John";
function sayHelllo() {
console.log(greeting); // "Hello John"
}
console.log(greeting); // "Hello John"
var name = 'John';
var name = 'Brad';
console.log(name) // 'Brad'
当在函数外部使用关键字 var 声明的变量是全局范围的,随处可见。
除此之外,带有关键字 var 的变量是可声明和可重新分配的。这意味着您可以重新声明相同的变量并重新分配它,而不会出现任何问题。
使用 var 时要记住的另一件事是,使用关键字 var 声明的所有变量和函数都被提升到其作用域的顶部。
二 、关键字 let 和 const
与关键字 var 不同,这两个关键字具有块作用域。这意味着当你在块中声明它们时,它们只能在该块 {}
内访问。
{
const a = 5;
let b = 6;
var c = 8;
}
//Accessing the variables outside the block.
console.log(a); //Error: a is not defined.
console.log(b); //Error: b is not defined.
console.log(c); // 8
使用 const 和 let 声明的变量在大括号之间的范围之外不可访问。这就是我们得到错误的原因。因为有时使用关键字 var你可能在不注意的情况下更改变量,所以它们很有用。
三 、var和let的区别
1、对于var
和let
的区别,var
在javascript
中是支持预解析的,而let
不支持预解析。
2、var可以重复定义同一个变量,但是let不可以。
3、let可以形成块级作用域,在es6之前javascript只有函数作用域,没有块级作用域。
const与var的不同,以上三点完全适用const。
<script>
console.log(a);
var a=100;
</script>
运行结果
<script>
console.log(a);
let a=100;
</script>
运行结果
<script>
for(var i=0;i<5;i++){
setTimeout(function(){
console.log(i);
},i*200)
}
</script>
上面的代码执行结果为:每隔200ms依次打印5,一共打印5次。
结果为什么是这样的呢?这里面涉及里javascript
里面的两个知识点,作用域和定时器setTimeout
回调函数异步执行。这段代码用var
声明了一个全局变量i
,循环执行完成之后,i
变为5,此时javascript
主线程空闲,异步回调队列中的函数依次被eventloop
放进主线程执行,因为此时的i已经变为了5,所以打印了5次5。
改造一:
<script>
for(var i=0;i<5;i++){
(function(){
var t=i;
setTimeout(function(){
console.log(t);
},i*200)
}
}
</script>
上面的代码执行结果为:0 1 2 3 4
改造二:
<script>
for(let i=0;i<5;i++){
setTimeout(function(){
console.log(i);
},i*200)
}
</script>
上面的代码执行结果为:0 1 2 3 4
四、let 和 cosnt 之间的区别
const是用来定义常量的,常量定义之后是不允许改变的。
const定义常量必须赋值。不赋值的话,没有任何意义,所以报错。
const name = "Brad";
const name = John; //Error.
let x = 1;
x = 2;
console.log(name); //"Brad"
console.log(x); // 2
用关键字 let 声明的变量是可重新分配的,而不是可重新声明的。虽然使用关键字 const 声明的变量不可重新分配且不可重新声明。
因此,只需将 let 用于稍后要更改的变量,而 const 用于你不想更改的常量变量。
总结
关键字 var :
-
函数作用域和全局作用域。
-
吊起。
-
可重新分配和重新申报。
关键字 let :
-
块范围。
-
没有吊起来。
-
可重新分配且不可重新申报。
关键字 const :
-
块范围。
-
没有吊起来。
-
不可重新分配且不可重新申报。
使用const和let是因为它们更安全和有用