做用域是任何一门编程语言中的重中之重,由于它控制着变量与参数的可见性与生命周期。很惭愧,我今天才深刻理解JS的做用域..我不配作一个程序员.. 开玩笑,何时理解都不晚,重要的是理解了之后能不能深深地扎在记忆里,不能,那就写下来
在一个代码块(括在一对花括号中的一组语句)中定义的全部变量在代码块的外部是不可见的。
ES6中新增的概念,在ES5中是没有的,ES5中没有? 没有的时候咱们代码也写的好好的,如今新增的概念,我不用不行吗? 来,拋一个典型的问题出来,你就明白块级做用域出现的重要性了。程序员
var i = 100; //全局变量 for(var i = 0;i < 5; i++){} console.log("i =",i); //i = 5
咱们用i变量只想在for循环中使用,并无想要修改全局变量的意思。你可能会说谁会用i作全局变量啊,那个全局变量i只是为了突出这个例子,修改全局变量事小,泄露成全局变量才是咱们担忧的。
怎么办?在ES5时代,尚未块级做用域这个概念,可是当时也有一种解决方法,那就是..
..
..
..
..
对,闭包,用后即焚:web
var i = 100; //全局变量 (function(){ for(var i = 0;i < 5; i++){} })() console.log("i =",i); //i = 100
ES6中为何会出现块级做用域的概念,那还要问let
和const
两兄弟。编程
使用let和const之后会发现,他们声明的变量做用域范围不会超过{}
这个圈数组
for(let i = 0; i < 5; i++){}; console.log("i =",i); //i is not defined
let 对比以前 var 声明的变量总结有如下几点不一样:闭包
{ let a = 1; } console.log(a); //Uncaught ReferenceError: a is not defined { var a = 1; } console.log(a); //1
let a = 1; let a = 2; //Uncaught SyntaxError: Identifier 'a' has already been declared var a = 1; var a = 2; // a = 2
// 大括号中a使let声明,因此只能在声明后使用(不存在声明提早,a = undefined的状况) var a = 10; { console.log(a); //Uncaught ReferenceError: a is not defined let a = 2; console.log(a); //2 } // 大括号中a使var声明 var a = 10; { console.log(a); //undefined var a = 2; console.log(a); //2 }
window.a = 1; var a = 2 ; console.log(a); // 2 console.log(window.a); // 2 window.b = 1; let b = 2 ; console.log(b); // 2 console.log(window.b); // 1
const 声明的对象,是能够修改内部属性的,数组同理;编程语言
主要总结一下块级做用域、以及块级做用域出现的意义,方便更好的记住。
let 和 const 产生必定有它的意义,ES6其余的新特性也同样。
其余特性会在接下来总结。spa
同步公众号:code