变量
变量是可以用于保存任何类型的数据。每个变量只不过是一个保存任意值的命名占位符。
var关键字
- 定义了一个名为message的
变量(不初始化的情况下,变量会保存一个undefined)
- 使用
var操作符,后跟变量名(即标识符)
var message;
- 定义了一个名为message并保存
字符串hi的变量
- 定义变量的同时设置它的值
var message = "hi"
var声明作用域
- 使用
var操作符定义的变量会成为包含它的函数的局部变量,也就意味着该变量将在函数退出时被销毁。
function test() {
var message = "hi";
}
test();
console.log(message);
- 在函数内定义变量时
省略var操作符,可以创建一个全局变量。(不推荐)
- 在局部作用域中定义的全局变量很难维护,不能一下子断定省略var是不是
有意而为之
function test() {
message = "hi";
}
test();
console.log(message);
var声明提升
- 使用
var关键字声明的变量会自动提升到函数作用域顶部(提升 hoist),
function foo(){
console.log(age);
var age = 26;
}
foo();
等价:
function foo(){
var age;
console.log(age);
age = 26;
}
foo();
let声明
let与var的区别是
let声明的范围是块级作用域(变量的作用域仅限于该块内部);
if (true) {
let age = 26;
console.log(age);
} console.log(age);
var name;
var name;
let age;
let age;
if (true) {
var name = 'Matt';
console.log(name);
}
console.log(name);
暂时性死区
console.log(age);
let age = 26;
console.log(age);
let age;
age = 26;
console.log(name);
var name = 'Matt';
var name;
console.log(name);
name = 'Matt';
全局声明
- 使用
let在全局作用域中声明的变量不会成为window对象的属性(var声明的变量则会)
let声明仍然是在全局作用域中发生的,相应的变量会在页面的生命周期内存续
let age = 26;
console.log(window.age);
var name = 'Matt';
console.log(window.name);
for循环中的let声明
- 在
let出现之前,for循环定义的迭代变量会渗透到循环体外部。迭代变量保存的是导致循环退出的值:5
for(var i = 0;i < 5; ++i) {
setTimeout(()=>console.log(i),,0)
}
- 使用
let关键字,迭代变量的作用域仅限于for循环内部。JavaScript引擎在后台会为每一个新的迭代变量。
for(let i = 0;i < 5; ++i) {
setTimeout(()=>console.log(i),,0)
}
const声明
- const 的行为与 let 基本相同,唯一一个重要区别是用它声明变量时必须同时初始化变量,且尝试修改const声明的变量会导致运行时错误
const age = 26;
age = 36;
- const 声明的限制只适用于它指向的变量的引用。 比如:如果const变量引用一个对象,那么修改这个对象内部的属性并不违反const的限制
const person = {};
person.name = 'Matt';
声明风格及最佳实践