Open yygmind opened 5 years ago
真棒
有那么复杂么, 我认为就一句话, 箭头函数没有"自己"的this, this的值是父级函数的值
赞
插眼
思考题: 这里其实可以看成下面这样:
function _say() {
console.log(this);
}
console.log(obj);
var obj = {
say: _say.bind(obj)
}
obj.say();
输出undefined window
。
如有误请指正
有些不理解,先标记一下
不太明白上期思考题,第一个为什么打印1,那个立即执行函数不是在 myObject.add的域中嘛
不太明白上期思考题,第一个为什么打印1,那个立即执行函数不是在 myObject.add的域中嘛
在我的理解里:像add是由myObject这个对象调用。所以add的this指向myObject。立即执行函数没有对象去调用它所以执行window。就像setTimeout那样
本期的主题是this全面解析,本计划一共28期,每期重点攻克一个面试重难点,如果你还不了解本进阶计划,文末点击查看全部文章。
如果觉得本系列不错,欢迎点赞、评论、转发,您的支持就是我坚持的最大动力。
上篇文章详细的分析了各种this的情况,看过之后对this的概念就很清晰了,没看过的去看看。
我们知道this绑定规则一共有5种情况:
其实大部分情况下可以用一句话来概括,this总是指向调用该函数的对象。
但是对于箭头函数并不是这样,是根据外层(函数或者全局)作用域(词法作用域)来决定this。
对于箭头函数的this总结如下:
箭头函数不绑定this,箭头函数中的this相当于普通变量。
箭头函数的this寻值行为与普通变量相同,在作用域中逐级寻找。
箭头函数的this无法通过bind,call,apply来直接修改(可以间接修改)。
改变作用域中this的指向可以改变箭头函数的this。
eg.
function closure(){()=>{//code }}
,在此例中,我们通过改变封包环境closure.bind(another)()
,来改变箭头函数this的指向。题目1
空
白
占
位
符
正确答案如下:
最后一个
person1.show4.call(person2)()
有点复杂,我们来一层一层的剥开。var func1 = person1.show4.call(person2)
,这是显式绑定,调用者是person2
,show4
函数指向的是person2
。func1()
,箭头函数绑定,this指向外层作用域,即person2
函数作用域首先要说明的是,箭头函数绑定中,this指向外层作用域,并不一定是第一层,也不一定是第二层。
因为没有自身的this,所以只能根据作用域链往上层查找,直到找到一个绑定了this的函数作用域,并指向调用该普通函数的对象。
题目2
这次通过构造函数来创建一个对象,并执行相同的4个show方法。
空
白
占
位
符
正确答案如下:
题目一和题目二的区别在于题目二使用了new操作符。
上期思考题解
依次给出console.log输出的数值。
答案有两种情况,分为严格模式和非严格模式。
TypeError: Cannot read property 'num' of undefined
解答过程:
内容来自评论区:【进阶3-1期】JavaScript深入之史上最全--5种this绑定全面解析
本期思考题
分别给出console.log输出的内容。
参考
进阶系列目录
交流
进阶系列文章汇总:https://github.com/yygmind/blog,内有优质前端资料,欢迎领取,觉得不错点个star。
我是木易杨,网易高级前端工程师,跟着我每周重点攻克一个前端面试重难点。接下来让我带你走进高级前端的世界,在进阶的路上,共勉!