JS学习笔记01-变量
var 、let 关键字
1.var声明的变量,会成为包含它的函数的局部变量,该变量会在函数退出时销毁。
如果省略var关键字,则会创建一个全局变量(不建议)。
function test() { var message1 = "hi"; // 局部变量 message2 = "hi"; // 全局变量 } test(); console.log(message1); // 出错! console.log(message2); // "hi"
2.let 声明的变量,范围是块作用域;const声明的作用域也是块。
if (true) { var name = 'tom'; console.log(name); // tom } console.log(name); // tom if (true) { let age = 22; console.log(age); // 22 } console.log(age); // ReferenceError: age没有定义
同一个作用域也不能多次声明(var 可以多次声明,var和let也不能同时声明);const也不允许重复声明。
var name; var name; let age; let age; // SyntaxError var home; let home; // SyntaxError let sex; var sex; // SyntaxError
3.声明提升:var 声明的变量会提升到函数顶部,let声明的变量则不会在作用域中提升(let声明之前的执行瞬间成为“暂时性死区”)。
// name会被提升 console.log(name); // undefined var name = 'name'; // age不会被提升 console.log(age); // ReferenceError:age没有定义 let age = 26;
4.全局声明:var声明的变量,会成为window对象的属性,let声明的变量则不会。
var name = 'name'; console.log(window.name); // 'name' let age = 26; console.log(window.age); // undefined
5.for循环中的声明
使用var声明的迭代变量,会渗透到循环体外部;let声明的则不会,使用let声明的迭代变量,仅限于for循环内部。
for (var i = 0; i < 5; ++i) { // 循环逻辑 } console.log(i); // 5 for (let j = 0; j < 5; ++j) { // 循环逻辑 } console.log(j); // ReferenceError: j没有定义