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