中午偷个闲作个es6let的使用总结es6
{ let a= 10; { let a= 20; console.log('子做用域', a);// 20 } console.log('父做用域', a);// 10 }
// 例子一 { let a= 10; var b= 20; } console.log(a) // ReferenceError: a is not defined.会报引用错误 console.log(b) // 20 //例子二 // 使用var声明,则会提高为外层变量,次例子中的i提高为外层变量,也就是提高到上一个执行上下文 var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 循环执行完后,i被赋值为10,因此最终结果为10 // 使用let申明i,当前的i只在本轮循环有效,因此每一次循环的i其实都是一个新的变量,因此最后输出的是6 // for循环还有一个特别之处,就是设置循环变量的那部分是一个父做用域,而循环体内部是一个单独的子做用域 var a = []; for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 6
'use strict'; { if (true) // 报错 function func() { } }
{ let a= 10; { // 在该做用域里面,a尚未声明完成 console.log(a); // ReferenceError: a is not defined let a= 20; // 若是这里不声明就不会报错,则a引用的是父做用域的a console.log(a); // 20 } }
// 报语法错误 { let a= 10; let a= 20; } // 因此不能在函数内部从新声明参数 function func(arg) { let arg= 20; }
var a= 10; function func(){ console.log(a); // undefined if(false) { var a= 20; // 在该执行上下文里,'变量对像'建立的过程当中会作变量提高,肯定做用域链,因此console时输出的是内部这个a,并不会改变外层的a,至关于从新申明了一个变量a,指向不一样于外层a变量的栈内存的地址,也因为不一样的执行上下文,不一样的变量对像 } } func() console.log('外层a',a) // 10