- 建议参考书籍《你不知道的JavaScript》上卷 P82 第2章:this全面解析。
- GitHub:https://github.com/susuGirl
箭头函数特点
-
this的指向问题,函数体内的this对象,就是定义是所在的对象,而不是使用时所在的对象。箭头函数里面没有自己的this,而是引用外层的this,所以也不能用call、apply、bind方法去改变this指向
-
不可以当做构造函数,也就是说不能new,否则报错
-
不存在arguments对象,如果要用就用rest参数代替
-
不能使用yield命令,因此箭头函数不能用作Generator函数
箭头函数的好处
-
简化了写法:各种简洁写法(注:部署管道机制,即前一个函数的输出是后一个函数的输入)
-
普通函数里各种this指向,对于this的写法容易导致编程风格混淆的问题
- 只使用词法作用域并完全抛弃错误的this风格的代码
- 完全采用this风格,在必要时使用bind,尽量避免使用self=this和箭头函数
- 普通函数各种this指向,容易造成this指向被隐式改变的问题
箭头函数与普通函数的区别
-
箭头函数的this指向是在函数创建的时候生成的
-
普通函数的this指向是在调用的时候生成的
-
箭头函数不使用this的四种标准规则,而是根据外层(函数或者全局)作用域来决定this。它用更常见的此法作用域取代了传统的this机制,他会根据当前的词法作用域来决定this,具体来说箭头函数会继承外层函数调用的this绑定(无论this绑定到什么)。这其实和ES6之前代码中的selt=this机制一样。
(注:词法作用域是由你写代码时将变量和块作用域写在哪里来决定的)
普通函数this指向
- 注:学会从调用栈中分析出真正的调用位置,因为它决定了this的绑定
-
默认绑定:独立函数调用
- 非严格模式下:this指向全局对象(window)
- 严格模式use strict下:this指向undefined
-
隐式绑定
-
调用位置是否有上下文对象,若有,函数调用中的this绑定到这个上下文对象
-
缺点:被隐式绑定的函数会丢失绑定对象,也就是说会应用默认绑定
-
-
显示绑定
-
用call、apply、bind,把函数的this指向强制绑定到新的对象上(传入的对象不为null、undefined)
-
-
new绑定
-
使用new来调用一个函数foo,我们会构造一个新对象并把它绑定到foo调用中的this上
-
-
优先级:new绑定>显示绑定>隐式绑定>默认绑定