this
調(diào)用位置:函數(shù)在代碼中調(diào)用的位置,而不是聲明的位置。
調(diào)用棧:為了到達(dá)當(dāng)前執(zhí)行位置的所有調(diào)用的函數(shù)。
例子:
? ?
function baz(){//當(dāng)前調(diào)用棧為baz//調(diào)用位置是全局作用域 console.log("baz");bar(); //bar的調(diào)用位置 }function bar(){//當(dāng)前調(diào)用棧為bar->baz//調(diào)用位置是baz console.log("bar");foo(); //foo調(diào)用位置 }function foo(){//當(dāng)前調(diào)用棧為foo->bar->baz//調(diào)用位置是bar console.log("foo");}?
調(diào)用位置則是調(diào)用棧的第二個(gè)元素,可以使用調(diào)試器找出調(diào)用棧。
函數(shù)執(zhí)行過程中如何使用調(diào)用位置決定this的綁定對象。
this綁定有四種規(guī)則:
1.默認(rèn)綁定:this指向全局對象,可以看做無法應(yīng)用其他規(guī)則時(shí)的默認(rèn)規(guī)則。
??
function foo(){console.log(this.a);}var a = 2;foo() // 2?
通過分析調(diào)用位置,發(fā)現(xiàn)foo()是直接使用不帶任何修飾的函數(shù)進(jìn)行調(diào)用的。
?
2.隱式綁定:調(diào)用位置是否有上下文。
?
function foo(){console.log(this.a);}var obj = {a:2,foo:foo};obj.foo() //2?
?
調(diào)用位置會使用obj上下文來引用函數(shù)。注意,當(dāng)使用回調(diào)函數(shù)時(shí),因?yàn)楹瘮?shù)作為參數(shù)傳入時(shí),實(shí)際上是一個(gè)隱式賦值操作,如下:
function foo(){console.log(this.a)}function doFoo(fn){//fn其實(shí)引用的是foo fn(); //調(diào)用位置 }var obj ={a:2,foo:foo}var a = "global";doFoo(obj.foo); //"global"?
?
3.顯式綁定:即使用call,apply,bind等內(nèi)置函數(shù)修改this的值。
var obj ={a:2 } function d (){console.log(this.a) } d.call(obj); //2?
顯式綁定中有一種硬綁定:用于為了保證this不缺失,如下:
??
var obj ={a:2 } var abc = function(){d.call(obj); //d函數(shù)的this一直指向了obj } function d (){console.log(this.a) } abc(); //2?
4:new綁定。(Js中的new與其他語言完全不同)
? new操作有以下四個(gè)步驟:
? 1.創(chuàng)建一個(gè)全新的對象。
? 2.這個(gè)對象會被執(zhí)行原型鏈接。
? 3.這個(gè)對象會綁定到函數(shù)調(diào)用的this.
? 4.如果函數(shù)沒有返回其他對象,則new表達(dá)式中的函數(shù)調(diào)用自動返回這個(gè)對象。
?
function foo(){this.a =2;}var baz = new foo();console.log(baz.a); //2?
最后是優(yōu)先級:
? ?new>顯示>隱式>默認(rèn)。
? ?具體例子可參考書P91~P。。。
??
轉(zhuǎn)載于:https://www.cnblogs.com/Darlietoothpaste/p/6391307.html
總結(jié)
- 上一篇: Linux进程资源管理第二篇 ---
- 下一篇: linux常用命令-查看文本/cat,t