而在严格模式下, 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))
}
,bind(),调用一个新创建的函数,其新函数的this值会被绑定到给定bind()的第一个参数。
es6,参数表达,传参
bind(this),生成的新的updateChangedOptionAndMask,会把本身this的updateChangedOptionAndMask方法覆盖掉吗
不会覆盖,注入到this对象是一个新的引用,不是同一个东西,注入是一个未知的引用不能直接通过对象.的方法是使用,必须将他付给一个新的方法,才能使用。
var newfunc=func.bind(this,1,2)
生成一个新的方法,却不能想普通函数的参数传递调用他,而是将他们的参数累积起来。