1、严格性
①、如果一个变量在未var声明之前使用,浏览器报告undefined。
②、如果一个变量在未let或者const声明之前使用,浏览器报告错误。
一个变量在未做任何声明之前使用会报告错误,比如
console.log(i);
浏览器会报告错误:Uncaught ReferenceError: i is not defined。
如果在var声明之前使用是:
console.log(i);
var i;
浏览器则会输出:undefined,不会报告错误。
如果是在let和const声明之前使用:
console.log(i);
let i;
或者
console.log(i);
const i=1;
则会报告错误:Uncaught ReferenceError: Cannot access 'i' before initialization。
2、声明
①、var声明的变量可以重复的,即使是在同一作用域。
②、let和const在同一作用域当中是不能重复声明的。
var i=1;
var i=2;
let j=3;
// let j=4;//报告错误
const k=5;
const k=6;//报告错误
3、作用域
①、var声明的变量要么是全局的,要么就是函数级的,没有块级作用域之说。
②、let、const属于块级作用域,一对{}就是一个块。
var的例子:
var i=1;
{
var i=2;
console.log('在块中输出i:'+i);
}
(function test(){
var i=3;
console.log('在函数中输出i:'+i);
})();
console.log('在全局中输出i:'+i);
输出:
在块中输出i:2
在函数中输出i:3
在全局中输出i:2
let的例子:
let j=1;
{
let j=2;
console.log('在块中输出j:'+j);
}
(function test(){
let j=3;
console.log('在函数中输出j:'+j);
})();
console.log('在全局中输出j:'+j);
输出:
在块中输出j:2
在函数中输出j:3
在全局中输出j:1
const的例子:
const k=1;
{
const k=2;
console.log('在块中输出k:'+k);
}
(function test(){
const k=3;
console.log('在函数中输出k:'+k);
})();
console.log('在全局中输出k:'+k);//在全局中输出
输出:
在块中输出k:2
在函数中输出k:3
在全局中输出k:1
在《JavaScript(8):即时函数》中经典面试题中,有下面的代码
for(var i=0;i<5;i++){
setTimeout( function(){
i=i+1;
console.log(i);
},5000);
};
console.log('i:'+i);
实际输出为:
如果要输出1、2、3、4、5,使用即时函数可以达到目的:
for(var i=0;i<5;i++){
(function(x){
setTimeout( function(){
x=x+1;
console.log(x);
},5000)
})(i);
}
console.log('i:'+i);
但更简单的是使用let声明变量即可:
for(let i=0;i<5;i++){
setTimeout( function(){
i=i+1;
console.log(i);
},5000);
};
4、赋值
①、var、let声明的变量是可以改变的;
②、const声明的变量则不行。注意:如果将一个对象定义为const,那么这个对象就不能重新赋值(对象为引用类型),但是对象的属性和方法是可以改变的。
const stu1={id:1,name:'小宋',math:89.0};
console.log(stu1.math);
stu1.math=97.5;
console.log(stu1.math);
stu1={name:'小王'};//报告错误
输出:
如果要完全锁定对象,可以使用Object.freeze方法。
const stu1={id:1,name:'小宋',math:89.0};
console.log(stu1);
stu2=Object.freeze(stu1);
stu1.math=97.5;
stu1.name='小王';
console.log(stu1);
console.log(stu1===stu2);
stu2.math=97.5;
stu2.name='小王';
console.log(stu2);
console.log(stu1===stu2);
输出:
5、结论:
①、尽量使用let和const,少用var;
②、尽可能地使用严格模式。
'use strict';
//......变量的定义与使用