var 描述
var、let、const 区别?
变量声明,无论发生在何处,都在执行任何代码之前进行处理。
用 var 声明的变量的作用域是它当前的执行上下文,它可以是嵌套的函数,或者对于声明在任何函数外的变量来说是全局。
var a ; //声明在任何函数外的变量
function inner(){
a='改变了a的值'
}
inner()
console.log(a) //改变了a的值
当赋值给未声明的变量, 则执行赋值后, 该变量会被隐式地创建为全局变量(它将成为全局对象的属性)。
声明和未声明变量之间的差异是:
- 声明变量的作用域限制在其声明位置的上下文中,而非声明变量总是全局的。
function inner(){
a ="内部a";
var b = "内部b" ; //将会报错
}
inner()
console.log(a) //内部a
console.log(b) //Uncaught ReferenceError: b is not defined
- 声明变量在任何代码执行前创建,而非声明变量只有在执行赋值操作的时候才会被创建。
console.log(a); // Uncaught ReferenceError: a is not defined
console.log('still going...'); // 后面就不执行了
var a;
console.log(a); // 打印"undefined"
console.log('still going...'); // 后面接着执行打印"still going..."
- 声明变量是它所在上下文环境的不可配置属性,非声明变量是可配置的(如非声明变量可以被删除)
var a = 1;
b = 2;
delete this.a;
delete this.b;
console.log(a); //打印'1'
console.log(b); //Uncaught ReferenceError: b is not defined
变量提升
由于变量声明(以及其他声明)总是在任意代码执行之前处理的,所以在代码中的任意位置声明变量总是等效于在代码开头声明。这意味着变量可以在声明之前使用,这个行为叫做“hoisting”。“hoisting”就像是把所有的变量声明移动到函数或者全局代码的开头位置。
bla = 2
var bla;
// 可以隐式地(implicitly)将以上代码理解为:
var bla;
bla = 2;
给两个变量赋值成字符串值
var x = y, y = 'A';
console.log(x + y); // undefinedA
x和y已经隐式地创建为全局变量,默认为undefined,之后又将A
赋值给 y
var y = 'A' , x = y ;
console.log(x + y); // AA
可以看到,使用var给两个变量赋值是从左到右依次赋值的
var、let、const 区别?
var 方式定义变量有啥 bug ?
- Js没有块级作用域
for(var i=0;i<10;i++){
var a = 'a';
}
console.log(i,a); //10 "a"
明明已经跳出 for 循环了,却还可以访问到 for 循环内定义的变量 a ,甚至连 i 都可以被放访问到
2. 循环内变量过度共享
for (var i = 0; i < 3; i++) {
setTimeout(function () {
console.log(i)
}, 1000);
}
控制台输出了3个3,而不是预想的 0、1、2
循环本身及三次 timeout 回调均共享唯一的变量 i
。当循环结束执行时,i
的值为3。所以当第一个 timeout 执行时,输出的 i
的值也为 3 了
把上述的两个例子中的 var 替代成 let 再运行一次。第一个例子i
和a
的值就访问不到了,而第二个例子也能依次输出0、1、2了
而const 就是用来定义常量的