BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java-script / #5497同步于 2020/9/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
JavaScript机器人发帖

关于this指向问题

oybalabala
2020/9/6镜像同步3 回复
普通函数的obj2.c()为啥指向window啊?? 箭头函数那俩也不太懂。有大佬能指点一二嘛
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
leone机器人#1 · 2020/9/6
第一个问题,其实相当于 a(),没用任何对象去调。 第二个问题,换个说法吧,剪头函数没有自己的this,它会用自己外层的this。 如果不懂的话,最后推荐你看现代javascript教程,哪里有更清晰的解释。
zsa2020ZSA机器人#2 · 2020/9/6
补充楼上:从为什么引入this机制?(补充对象无作用域?),箭头函数解决了什么问题?从这两个角度可以更好理解。
AlHg机器人#3 · 2020/9/8
原文章给出的角度是逻辑的角度,方便记忆,并非实现的角度,我这里就说说实现,看看能不能加深理解 在JavaScript世界中,所有的函数调用都是function.call(thisArg, arg1, arg2, ...)的语法糖。这个方法在Function.prototype.call()中给出,而且既然所有对象都应该有Function作为直接或间接的原型(即使是Function它自己),那么所有的函数都能够使用(且必须使用其作为函数调用的实现方法)。因此,不论是方法调用,还是普通函数调用,还是箭头函数调用,其捕获的this值就可以化为Function.prototype.call()这个函数实现中第一个参数的“奇异”行为,由语言规范决定了这个参数未提供时(大多数使用场景都没有显式提供),所产生的默认行为是什么。这样一来,这个问题就可以简化为函数调用的默认行为,不必单独记忆; 接着,就说说这个参数的默认值是什么和语法糖如何展开,弄清楚默认值,也就能清楚箭头函数如何自动捕获外部参数(在这里就是this) 作为普通函数被调用时,这个参数的默认值很简单,就是全局对象(如果是严格模式,消除了大多数的“奇异行为”,默认值为undefined) 作为方法被调用时,语法糖被展开,这个参数被绑定到了所在的上层对象,在这里,调用c时的上层对象就是obj2,但c函数体内部调用的a函数并没有作为方法被调用,因此此刻的a函数,没有默认的绑定参数出现,同时又是非严格模式,于是默认值为全局对象,在浏览器环境下为window 作为构造函数的普通函数,调用时语法糖展开,参数指向新生成对象,但这个行为实际上和上一个一致,不再赘述; 至于箭头函数。实现上箭头函数与Function并无什么关联,事实上是脱离了原型链的语法级别的孤家寡人,不仅没有this还没有arguments,但是同样可以按照Function.prototype.call()的默认值来理解。箭头函数具有lambda表达式的行为,在声明时,会“捕获”外部的上下文。就如第二个例子中,a被定义为箭头函数,此时在声明时就会将所在作用域的this(还有arguments)捕获。至于为何不是运行时捕获?从设计的角度想,箭头函数本身就是匿名函数表达式的最佳实践,是以往的函数表达式的上层替代,本身就不应当被定义后传来传去的,而应当保持其与原有作用域的关系