关于this指向的一些问题
以前不是写js的,看了很多资料但是对js的this指向还是很晕。搜索了一下this指向相关的文章,基本思路就是1、无任何调用时this指向windows 2、调用函数时this指向调用当前函数的对象 3、如果是对象链式调用,那么this指向最近一次调用它的对象 4、普通回调函数中的this指向windows 5、如果是以箭头函数作为回调函数,这是this指向回调函数外部作用域的this。
那么按这个说法来讲,judge函数中的this指的就是judger的实例对象。judge函数调用成员变量fenceGroup对象的each方法,那么这时候this不是应该重新指向了fenceGroup了么,为什么这时候在each回调函数里还能用this.findPotainalPath这个方法呢?
因为我查到的很多资料只是说回调函数中的this是回调函数外层作用域的this,并没有提到对象嵌套调用回调函数的问题,所以不是很清楚这个外层作用域是怎么个外层法
正在回答 回答被采纳积分+1
这是由于this丢失导致的问题,我们打印this显示undefined,式因为小程序默认开启use strict模式导致,如果在非严格模式下,这个this会绑定window/global对象。也就是默认绑定。
这里至少有三种方法解决:
把this作为参数传入eachCell,eachCell(this, cell, x, y)。只是不够优雅,而且阅读eachCell源码的时候,如果不知道Judge细节,会觉得莫名其妙
箭头回调函数方式,就是老师讲的方法。ES6箭头函数的this:ES6中的箭头函数并不会使用四条标准的绑定规则,而是根据当前的词法作用域来决定
this
,具体来说,箭头函数会继承外层函数调用的this
绑定(无论this
绑定到什么)。这其实和ES6之前代码中的self = this
机制一样。——你不知道的JavaScript(上卷)bind绑定,又叫做this硬式绑定(绑定后无法修改this)。
constructor(fenceGroup) {
this.fenceGroup = fenceGroup
this._initPathDict()
this._initSkuPending()
this._changeOtherCellStatus = this._changeOtherCellStatus.bind(this)
}
最后一行,把_changeOtherCellStatus 硬式绑定到this(Judegr 的对象实例),这样哪怕_changeOtherCellStatus作为callback参数,this也不会丢失依旧绑定Judger对象。
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星