// 作用域和变量提升示例 functionscopeAndHoistingExample() { // var 示例 console.log(varBeforeDeclaration); // undefined var varBeforeDeclaration = 'var declared later';
// let 示例 // console.log(letBeforeDeclaration); // ReferenceError let letBeforeDeclaration = 'let declared later';
// 块级作用域示例 if (true) { var varInBlock = 'var in block'; let letInBlock = 'let in block'; } console.log(varInBlock); // 'var in block' // console.log(letInBlock); // ReferenceError
// 全局对象属性示例 var globalVar = 'global var'; let globalLet = 'global let'; console.log(window.globalVar); // 'global var' console.log(window.globalLet); // undefined
// 变量重声明示例 var varReDeclared = 'first var'; var varReDeclared = 'second var'; console.log(varReDeclared); // 'second var'
// let letReDeclared = 'first let'; // let letReDeclared = 'second let'; // SyntaxError }
scopeAndHoistingExample();
// 循环闭包示例 functionloopClosureExample() { // var 示例 var varFuncs = []; for (var i = 0; i < 3; i++) { varFuncs[i] = function() { console.log("My value (var): " + i); }; } for (var j = 0; j < 3; j++) { varFuncs[j](); // 输出三次 'My value (var): 3' }
// let 示例 let letFuncs = []; for (let k = 0; k < 3; k++) { letFuncs[k] = function() { console.log("My value (let): " + k); }; } for (let l = 0; l < 3; l++) { letFuncs[l](); // 依次输出 'My value (let): 0', 'My value (let): 1', 'My value (let): 2' } }
loopClosureExample();
最佳实践
优先使用 let:在大多数情况下,建议优先使用 let 来声明变量,因为它的块级作用域可以使代码更具可读性和可维护性,减少因变量作用域问题导致的 bug。