this
何意?在英文中this
是一我的稱代詞,表示這個的,具體指哪一個?不肯定,只有在具體的語境中才可肯定,在編程語言中this
也有一樣的相似特性。
在js中this
是一個關鍵字,它不能被當作變量、屬性
,也不能夠進行賦值
操做。this
隨着函數使用場景的不一樣,而發生變化。this
是當前執行上下文中的一部分。javascript
this
永遠指向函數的調用者
。獨立調用
時,this指向全局對象window
(非嚴格模式),undefined
(嚴格模式)對象的方法
被調用時,this指向該對象// 聲明一個函數 function show(){ console.log(this); } // 聲明一個對象(變量) var obj={ _show:show } // 獨立調用 show(); // window(非嚴格模式) undefined(嚴格模式) // 做爲某個對象的方法調用 show._show(); // obj // 做爲構造函數被調用,指向對象實例 var s = new show(); // this->s // 做爲事件處理函數調用 var aLink=document.getElementById("J-link"); // 事件處理函數中,this指向觸發事件的DOM對象 aLink.onclick=show; // this->aLink
call()
,apply()
咱們可使用這兩個方法來顯示更改函數中this的指向,
java
call、apply
這兩個函數的共同特色:改變並當即執行
。
區別就是傳參方式不一樣編程
call
是一個一個傳入apply
是傳入一個數組,一次性傳完。bind()
,該方法也是強制更改this指向。可是bind和call、apply的區別是bind更改this後不會當即執行
,它會返回一個新函數
。
bind傳參也是一個一個的傳入數組
特別注意:
call/apply若是更改成原始值的null、undefined
,則this->window
call/apply若是更改成原始值的Number、String、Boolean
,則this->對應的包裝對象
// 聲明一個對象(變量) var obj={ name:"tom", age :20 }; // 聲明一個函數 function show(a, b){ console.log(this, a, b); } // 獨立調用 show(1, 2); // this->window(非嚴格模式) this->undefined(嚴格模式) // 強制更改this指向爲obj,並當即執行該函數 show.call(obj, 1, 2); // this->obj show.apply(obj, [1, 2]); // this->obj // 強制更改this指向obj,不會當即執行,它返回一個新函數,須要去主動執行這個新函數 show.bind(obj, 1, 2)(); // this->obj