1 块级作用域绑定
块级声明用于声明在指定块的作用域之外无法访问的变量。
块级作用域(亦被称为词法作用域)存在于:
a、函数内部
b、块中(字符{和}之间的区域)
let 声明变量: 可以把变量的作用域限制在当前代码块中
function getVale(condition){ if(condition){ let value ="blue"; return value; }else{ // 变量value在此处不存在 return null; } //变量value在此处不存在 }
禁止重复声明:假设作用域中已经存在某个标识符,此时再使用let关键字声明它就会抛出错误
var count = 30; // 抛出语法错误 let count = 40;
但如果当前作用域内嵌另一个作用域,便可在内嵌的作用域中用let声明同名变量
var count = 30; if(condition){ // 不会抛出错误 let count = 40; }
const声明:使用const声明的是常量,其值一旦被设定后不可更改。因此,每个通过const声明的常量必须进行初始化
// 声明常量 const maxItems = 30; // 未捕获的SyntaxError:常量声明中缺少初始值设定项 // Uncaught SyntaxError: Missing initializer in const declaration const name;
用const声明对象
const声明不允许修改绑定,但允许修改值。这也就意味着用const声明对象后,可以修改该对象的属性值。
const person = { name:"Nicholas" }; // 可以修改对象属性的值 person.name = "Greg"; // 抛出语法错误 person = { name:"Greg" }
循环中的块作用域绑定:
let声明变量i只存在于for循环中,一旦循环结束,在其他地方均无法访问该变量。
for(let i = 0; i < 10; i++){ process(items[i]); } // i这里不可访问,抛出一个错误 console.log(i);
<script> // 声明变量 let a; let b,c,d; let e = 100; let f = 520; g = 'iloveyou', h = []; // 1、变量不能重复声明 // let str = '张三'; // let str = '李四'; // 2、块级作用域 全局,函数,eval // if else while for 都有效 { let girl = '周扬青'; } //Uncaught ReferenceError: girl is not defined //console.log(girl); // 3、不存在变量提升 console.log(song); let song = '呵呵'; // 4、不影响作用域链 { let school = '北京大学'; function fn(){ console.log(school); } fn(); } </script>