function identify(){
return this.name.toUpperCase()
}
function speak(){
var greeting = '你好,我是'+identify.call(this)
console.log(greeting)
}
var me ={
name:'kyle'
}
var you ={
name:"reader"
}
identify.call(me)
identify.call(you)
speak.call(me) //? 你好,我是KYLE
speak.call(you) //? 你好,我是READER
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
上面的這段代碼中可以從不同的上下文對象 me 和 you 中重復的使用identify函數(shù)和speak函數(shù)
如果你不使用this的話 你就要顯式的將上下文對象作為參數(shù)傳遞進去,比如這樣:
function identify(context){
return context.name.toUpperCase()
}
function speak(context){
var greeting = '你好,我是'+identify(context)
console.log(greeting)
}
var me ={
name:'kyle'
}
var you ={
name:"reader"
}
identify(me)
identify(you)
speak(me)
speak(you)
function foo(){
console.log(this.a)
}
var obj1 = {
a:1,
foo:foo
}
var obj2 = {
a:2,
foo:foo
}
obj1.foo() //1
obj2.foo() //2
obj1.foo.call(obj2) //2
obj2.foo.call(obj1) //1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
可以看到 顯示綁定的優(yōu)先級還是更高一點
new 綁定跟隱式綁定比較
function foo(arg){
this.a = arg
}
var obj1 ={
foo:foo
}
var obj2 ={}
obj1.foo(2)
console.log(obj1.a) //2
var bar = new obj1.foo(4)
console.log(obj1.a) //2
console.log(bar.a) //4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
可以看到 new綁定的優(yōu)先級比隱式綁定要高
new 綁定跟顯示綁定比較
new跟call apply無法一起使用 無法通過new foo.call(obj),試一下硬綁定
在這里插入代碼片
1
function foo(arg){
this.a = arg
}
var obj1 ={}
var bar = foo.bind(obj1)
bar(3)
console.log(obj1.a) //3
var baz = new bar(4)
console.log(baz.a) //4
console.log(obj1.a) //3
1
2
3
4
5
6
7
8
9
10
11
new 調(diào)用bar修改了硬綁定時候的 函數(shù)的this new的優(yōu)先級高一點
所以我們可以根據(jù)下面的優(yōu)先級規(guī)則進行判斷了
1.函數(shù)是否在new中調(diào)用 是的話this綁定新創(chuàng)建的對象 var bar = new Foo()
2.函數(shù)是否通過call apply 顯示綁定或者是 bind硬綁定 如果是的話this指向指定的對象 foo.call(obj)
3.函數(shù)是否在某個上下文中調(diào)用 隱式綁定,如果是 this綁定那個上下文對象 注意綁定丟失的問題
4.如果都不是 就是默認綁定非嚴格模式下綁定的是全局對象 嚴格模式下綁定的是undefined