• 缄默
    2022-12-02 来自海南
    关于“new 是强于 hard binding 的”结论这一块的例子,bind方法本身就是返回一个新函数,对logger这个函数并无影响。而new出来的obj2的this肯定只与new传参时的值相关 。所以这个例子并不能推论出这一结论

    作者回复: 虽然下面是bind的polyfill,但是我们可以看到new是优先于bind的 this instanceof fNOP && oThis ? this : oThis // ... and: fNOP.prototype = this.prototype; fBound.prototype = new fNOP(); 我理解这样的优先级是为了让new可以忽略this的 hard binding,同时预置一些或全部的参数。

    共 2 条评论
    4
  • WGH丶
    2022-12-24 来自海南
    其他语言中也有this,python也有类似的self。JS的特殊之处在于支持多种编程范式,比如面向对象和函数式编程。本来this是在面向对象中使用就好,但是JS中没有类,有时候要靠函数创建对象,自然地,this从面向对象中被“移植”到了函数式编程中。像new,bind,apply,箭头函数这些,都像是一些补丁,以便更好地同时支持两种编程方式。正是这种适配,导致了JSer理解上的困惑。 java没有这个问题,其函数不能独立于对象使用。python虽然支持函数独立于对象使用,但是在对象外的函数,不再支持self,因此也没有这个困惑。

    作者回复: 很好的对比

    
    2
  • 拉莱耶的猫
    2022-10-09 来自北京
    隐式绑定那一节, aLogger跟代码里不一致

    作者回复: 谢谢指出,这里做些修改,之后也会更新到文稿里。 function aLogger() { console.log( this.a ); } var obj = { a: 3, logger: aLogger }; var a = 2; obj.logger(); // 3

    
    1
  • 奇得隆冬强
    2023-03-14 来自广东
    简答总结下,js 确实麻烦,作为一个 Android 工程师,我觉得还是 java 和 kotlin 好~~~~ 1、全局作用域下,this 始终指向全局对象 window,无论是否是严格模式! 2、普通函数内的 this 分为两种情况,严格模式下和非严格模式下。 严格模式下:直接调用函数,this 指向 undefined,window.test() 调用函数 this 指向 window 非严格模式下:直接调用函数和 window.test() 调用函数对象,this 都指向 window。 3、对象内部方法的 this 指向调用这些方法的对象,也就是谁调用就指向谁。多层嵌套的对象,内部方法的 this 指向离被调用函数最近的对象。 4、箭头函数:this 指向于函数作用域所用的对象。 箭头函数的重要特征:箭头函数中没有 this 和 arguments,都是从外层继承的; 箭头函数会捕获自己定义所处的外层执行环境,并且继承这个 this 值,指向当前定义时所在的对象。 箭头函数的 this 指向在被定义的时候就确定了,之后永远都不会改变。即使使用 call()、apply()、bind() 等方法改变 this 指向也不可以。 5、构造函数中的 this 是指向构造函数创建的实例。 6、原型链中的 this:在一个继承机制中,仍然是指向它原本属于的对象,而不是从原型链上找到它时,它所属于的对象。
    展开
    
    