[JS] 先bind后new,this的指向

JavaScript023

[JS] 先bind后new,this的指向,第1张

非严格模式下,以下调用方式中, this 绑定为全局对象 window ,

而在严格模式下, this 绑定为 undefined 。

值得注意是的,只有 this 处于严格模式中,才会绑定为 undefined ,

与 f 被调用的位置是否处于严格模式无关。

可见 new 对 this 的影响比 bind 优先级要高,

g 虽然通过 bind 绑定了 this 指向的对象为 {a:1} ,

但是使用 new g 调用的时候, this 仍然指向以 f 为构造函数的实例。

值得注意的有两点,

(1) bind 之后, g.prototype 为 undefined 。

(2) new g 返回的对象 obj ,使用 instanceof 判断 f 和 g 都为 true ,

原因就在于, V instanceof target 首先会先用 target[Symbol.hasInstance](V) 来判断,

然后再判断, target.prototype 是否在 V 的原型链上,参考 ECMAScript Language Specification

但是 bind 的柯里化作用还是有用的,

使用 call 或者 apply ,将 this 绑定为 null 或 undefined 并不会凑效,

此时, this 将绑定为全局对象。

然而,在严格模式下, this 将绑定为 null 或 undefined ,

值得一提的是,在非严格模式下, f.call(1)会自动将 1 包装成 new Number(1) ,

然后 this 指向的是这个包装对象。

而在严格模式下, f.call(1)会将 this 绑定为 1 。

b={} 相当于 b=new Object ,因此, b 是 Object 构造函数的实例。

而 Object.create(null) 会创建一个空对象,它没有原型。

注意, Object.create(undefined)会报错,

赋值表达式的返回值是函数的引用,因此相当于 f() ,

而不是 obj1.f() ,也不是 obj2.f() 。

你不知道的JavaScript(上卷)

在JavaScript中,我们经常用到函数绑定,而当你需要在另一个函数中保持this上下文时,使用Function.prototype.bind()会很方便.

var myObj = {

specialFunction: function () {

},

anotherSpecialFunction: function () {

},

getAsyncData: function (cb) {

cb()

},

render: function () {

var that = this

this.getAsyncData(function () {

that.specialFunction()

that.anotherSpecialFunction()

})

}

}

myObj.render()

为了保持myObj上下文,设置了一个变量that=this,这样是可行的,但是没有使用Function.prototype.bind()看着更整洁:

render: function () {

this.getAsyncData(function () {

this.specialFunction()

this.anotherSpecialFunction()

}.bind(this))

}

this是当前这个对象。

方法调用模式(或称:对象属性模式)

先了解一个概念:方法和函数的区别。方法和函数本质一样,形式不同而已。看下例:

function fn(){alert(this)}这样就是定义了一个函数,当:fn()的时候,叫这个函数运行。同样是上面这个fn函数,如果把它赋值给一个对象的属性,就成了方法了,看下面的例子。

var obj=new Object()//先定义一个对象obj

obj.objFn=fn那现在的obj.objFn就是方法了,但其实objFn和fn指向的是同一个内存地址。但fn是直接定义的,就是函数,而objFn是obj这个对象上的一个属性,则objFn就是方法了。方法和函数本质上是一样的,只是在不同的情况下的叫法不同。

但当fn运行的时候,弹出的是window(任何函数被调用,this都表示window)而objFn运行的时候,弹出的是object,因为当它做为一个方法运行的时候,this关键字表示的是objFn这个属性所属的这个对象obj。也就是说,在这种情况下,this表示obj。

再啰嗦一遍:当函数成为一个对象的属性的值的时候,这个函数里的this指向当前这个对象(这时候函数就变成了方法)再啰嗦第三遍:当一个函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,this被绑定到该对象。方法可以使用this去访问对象,所以它能从对象中取值或修改对象。this到对象的绑定发生在调用的时候。这个“超级”迟绑定使得函数可以对this高度复用。通过this可取得它们所属对象的上下文的方法称为公共方法。