网站建立企业,西安做网站企业,科技医疗网站建设,wordpress图片类主题1 声明语法 var upperA A; let upperB B; const upperC C; 只声明不初始化的结果#xff0c;【 const定义的常量不可以修改#xff0c;而且必须初始化】 // var 声明变量 var upperA; console.log(打印大写的A#xff1a;%s, upperA); // 结果#xff1a;打印大写的A A; let upperB B; const upperC C; 只声明不初始化的结果【 const定义的常量不可以修改而且必须初始化】 // var 声明变量 var upperA; console.log(打印大写的A%s, upperA); // 结果打印大写的Aundefined // let 声明变量 var upperB; console.log(打印大写的B%s, upperB); // 结果打印大写的Bundefined // const 声明常量 const upperC; console.log(打印大写的C%s, upperC); // 错误SyntaxError: Missing initializer in const declaration 声明后值是否可修改【 const定义的常量不可以修改而且必须初始化】 // var 声明变量初始化并修改值 var upperA A; console.log(打印upperA%s, upperA); // 结果打印upperAA upperA LetterA; console.log(打印upperA%s, upperA); // 结果打印upperALetterA // let 声明变量初始化并修改值 var upperB B; console.log(打印大写的B%s, upperB); // 结果打印upperBB upperB LetterB; console.log(打印大写的B%s, upperB); // 结果打印upperBLetterB // const 声明常量初始化并修改值 const upperC C; console.log(打印upperC%s, upperC); // 结果打印upperCC upperC LetterC; console.log(打印upperC%s, upperC); // 错误TypeError: Assignment to constant variable. 2 变量提升
浏览器在运行代码之前会进行预解析首先解析函数声明定义变量解析完之后再对函数、变量进行运行、赋值等 不论var声明的变量处于当前作用域的第几行都会提升到作用域的头部 var 声明的变量会被提升到作用域的顶部并初始化为undefined而let声明的变量不会被提升到作用域的顶部 console.log(打印upperA%s, upperA); // 结果打印upperAundefined console.log(打印upperB%s, upperB); // 错误ReferenceError: upperB is not defined var upperA A; let upperB B; 3 是否允许重复声明同一个变量
var允许在相同作用域内重复声明同一个变量后面声明的变量会覆盖前面声明的变量 let不允许在相同作用域内重复声明同一个变量 var upperA A; let upperB B; // 重复声明 var upperA LetterA; let upperB LetterB; console.log(打印upperA%s, upperA); console.log(打印upperB%s, upperB) // 错误SyntaxError: Identifier upperB has already been declared 4 作用域
在ES6之前我们都是用var来声明变量而且JS只有函数作用域和全局作用域没有块级作用域所以{}限定不了var声明变量的访问范围 { var upperA A; } console.log(打印upperA%s, upperA); # 结果 打印upperAA // ---------- ES6新增的let可以声明块级作用域的变量。---------- { let upperB B; } console.log(打印upperB%s, upperB); // 错误 ReferenceError: upperB is not defined 5 let配合for循环的独特应用
let非常适合用于 for循环内部的块级作用域。 JS中的for循环体比较特殊每次执行都是一个全新的独立的块作用域用let声明的变量传入到 for循环体的作用域后不会发生改变不受外界的影响。 for (var i 0; i 10; i) { setTimeout(function() { // 同步注册回调函数到 异步的 宏任务队列。 console.log(i); // 执行此代码时同步代码for循环已经执行完成 }, 0); } // 输出结果10 共10个 // 这里面的知识点 JS的事件循环机制setTimeout的机制等 // ---------- 如果把 var改成 let声明---------- // i虽然在全局作用域声明但是在for循环体局部作用域中使用的时候变量会被固定不受外界干扰。 for (let i 0; i 10; i) { setTimeout(function() { console.log(i); // i 是循环体内局部作用域不受外界影响。 }, 0); } // 输出结果0 1 2 3 4 5 6 7 8 9