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))
}
his是指向当前引用对bai象duthis.name = name
-- 这个好理解,指向User对象,不是zhiUser function
this.my_alert = function() {
alert(this.name)
}
function 一个函dao数,这么理解有zhuan点“问题”,正shu确的说法是my_alert 是一个函数类型变量
my_alert 是User的一个属性,他本身是funtion类型,所以这个function类型中的this指向当前对象
this对象bai是在运行时基于函数的执行du环境绑定的,它可能是全局对象zhi或者其他的某个对象,随着函数的执行环境dao不同,this的值也会不一样。但是总有一个原则,那就是this指的是调用函数的那个对象。
还有另一个原则:当没有明确的调用函数的那个对象时,this指向全局对象global,浏览器模式下就是window了。
JavaScript:this是什么?
定义:this是包含它的函数作为方法被调用时所属的对象。
说明:这句话有点咬嘴,但一个多余的字也没有,bai定义非常准确,我们可以分3部分来理解它!
1、包含它的函数。2、作为方法被调用时。3、所属的对象。
看例子:
function to_green(){
this.style.color="green"
}
to_green()
上面函数中的this指的是谁?
分析:包含this的函数是,to_green
该函数作为方法被调用了
该函数所属的对象是。。?我们知道默认情况下,都是window对象。
OK,this就是指的window对象了,to_green中执行语句也就变为,window.style.color="green"
这让window很上火,因为它并没有style这么个属性,所以该语句也就没什么作用。
想要系统了解来尚学堂,线上线下,系统性教学。
非严格模式下,以下调用方式中, 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(上卷)