this 其实是在函数被调用时发生的绑定,它指向哪里彻底取决于函数在哪里被调用。面试
function foo(){
console.log(this.a)
}
var obj = {
a :2,
foo:foo
}
var bar = obj.foo
obj.foo()
bar()
复制代码
问: 最后两个打印出什么?数组
function foo(){
console.log(this.a)
}
var obj = {
a :2,
foo:foo
}
var obj2 = {
a:1,
obj:obj
}
var obj3 = obj2.obj.foo
obj2.obj.foo() // 2
obj3() //undefined
复制代码
问: 最后两个打印出什么? 答?bash
什么是默认绑定呢?上代码先app
var a = 2;
function foo(){
console.log(this.a)
}
function foo2(){
'use strict'
console.log(this.a)
}
foo() // 2
foo2() // TypeError: Cannot read property 'a' of undefined
复制代码
默认绑定总结:默认绑定即不带任何修饰的函数引用被调用时的绑定,此时 this 绑定到「 全局对象 window 」或者 「undefined」函数
当函数引用有上下文对象时,隐式绑定会把函数调用中的 this 绑定到这个上下文对象。ui
那么回到面试题this
function foo(){ console.log(this.a)}
var obj = { a :2, foo:foo }
var bar = obj.foo
obj.foo() //2
bar() /undefined
复制代码
foo() 被调用时,落脚点指向 obj 对象(上下文对象),因此 this 绑定到 obj ,this.a 即 obj.a , 因此打印出了 2spa
可是为何 bar() 打印出了 undefined 呢?prototype
虽然 bar 是 obj.foo 的引用,但其实是 foo函数 自己的引用,因此此时 bar() 是不带任何修饰的函数调用,使用默认调用code
function foo(){ console.log(this.a) }
var obj = { a :2, foo:foo }
var obj2 = { a:1, obj:obj }
var obj3 = obj2.obj.foo
obj2.obj.foo() // 2
obj3() //undefined
复制代码
跟上面一题相同,虽然引用链比较长,可是最后 foo() 是在 obj 中被调用,因此 this 绑定到 obj ,引用链只有最后一层影响调用位置。
使用「 call apply bind 」 进行绑定 this , this 绑定到第一个传入的参数
回到面试题第一题,咱们使用「 call 」进行显式绑定
function foo(){ console.log(this.a) }
var obj = {
a :2,
foo:foo
}
var bar =obj.foo
obj.foo() // 2
bar.call(obj) //2
复制代码
此时二者都打印出 2 ,由于咱们将 this 绑定到 obj ,打印出的便是 //obj.a //2
function foo(a){
this.a = a
}
var bar = new foo(2)
console.log(bar.a) // 2
复制代码
分析: 使用 new 调用 foo() 时,咱们构造一个对象并把它绑定到 foo() 调用的 this 上
####new 绑定总结: new 绑定中 this 绑定的就是新生成的对象
2 . 「 new 绑定 」函数是否在 new 中调用 ? 若是是 this 绑定的便是 新建立的对象。 var bar = new foo()
4.「 隐式绑定 」 函数是否在某个上下文中调用? 是的话,this 绑定的是那个上下文对象 var bar = obj.foo()
后记
你要是看不懂我也没办法了,个人修为都在这了。。。。
文章为我的总结,不足之处还请留言或私信。
转载请注明出处。
以上。