let声明
在同一个函数或者同一个作用域中重复用
let
定义一个变量会引起TypeError
,而var
不会1234if (true) {let a = 1;let a = 2; // Identifier 'a' has already been declared}在使用
let
声明的变量不会在块作用域中进行提升(MDN上的解释:let的暂存死区与错误),而var
声明的变量会提升12345function foo() {console.log(a);let a = 2;}foo(); // a is not defined, 如果使用var声明,变量a会得到提升,结果输出undefined使用
let
声明的变量会产生块级作用域1234567891011// 用var声明for (var i = 0; i < 5; i++) {console.log(i); // 输出0,1,2,3,4}console.log("循环结束后的i值为 " + i); // 输出5// 用let声明for (let i = 0; i < 5; i++) {console.log(i); // 输出0,1,2,3,4}console.log("循环结束后的i值为 " + i); // 抛出ReferenceError: i is not defined,因为let声明的变量产生了块级作用域,所以在for循环外部无法访问
const声明
const
声明创建一个只读的常量,拥有块级作用域12345678910if (true) {var a = 2;const MY_NUM = 3; // 在if作用域内的常量a = 4; // a被重新赋值为4MY_NUM = 6; // 抛出错误,通过const声明的变量MY_NUM只能被赋值1次}console.log(a); // 4console.log(MY_NUM); // 抛出错误, MY_NUM只在if的块级作用域内
模块
- 模块模式的必备条件
- 必须有外部的封闭函数,该函数必须至少被调用一次(每次调用都会创建一个新的模块实例)
- 封闭函数必须返回至少一个内部函数,这样内部函数才能在私有作用域中形成闭包,并且可以访问或者修改私有的状态
|
|
单例模式
|
|
现代的模块机制△△
|
|
this词法
作为对象的方法调用
this
指向该对象,作为普通函数调用this
指向全局对象,通过call()
和apply()
可以改变this
的指向123456789101112131415161718// 全局变量namevar name = "window";var obj = {name: "whiskey",getName: function() {return function() {return this.name;};}};var fn = obj.getName();console.log(fn); // 返回内层的匿名函数console.log(fn()); // window,作为普通函数调用this指向全局console.log(fn.call(obj)); //whiskey 通过call()绑定obj改变this指向用变量
that
储存this
1234567891011121314151617// 全局变量namevar name = "window";var obj = {name: "whiskey",getName: function() {// 把this对象赋值给一个that变量var that = this;return function() {return that.name;};}};var fn = obj.getName();console.log(fn()); // whiskey,函数返回后that仍然引用着objES6的箭头函数
12345678910111213141516//全局变量namevar name = "window";var obj = {name: "whiskey",getName: function() {// ES6的箭头函数,放弃了所有普通函数this绑定的规则,取而代之的是用当前词法作用域覆盖了this本来的值return () => {return this.name;};}};var fn = obj.getName();console.log(fn()); // whiskey,箭头函数继承了getName()函数的this绑定bind()
1234567891011121314var name = "window";var obj = {name: "whiskey",getName: function() {return function() {return this.name;}.bind(this);}};var fn = obj.getName();console.log(fn()); //whiskey 运用了bind()