## this關鍵字
JavaScript代碼都存在于一定的`上下文對象`中。上下文對象通過`this`關鍵字來動態指定,它永遠指向當前對象。簡單的說,就是返回屬性或方法“當前”所在的對象。
**this的工作原理**
在5種不同的情況下,`this`指向的各不相同。
**(1)全局范圍內**
```
this
```
當在全局范圍內使用`this`,它將指向全局對象
**(2)函數調用**
```
function test(){
console.log(this);
}
test();
```
這里的`this`也指向全局對象。
**(3)方法調用**
```
test.foo();
```
這個例子中,`this`指向test對象。
**(4)調用構造函數**
```
new test();
```
如果函數傾向于`new`關鍵詞一塊使用,則我們稱這個函數是構造函數。在函數內部,`this`指向新創建的實例對象。
**(5)顯式的設置this**
```
function test(a, b) {}
var bar = {};
test.apply(bar, [1, 2]); //數組將會會被擴展
test.call(bar , 1, 2); // 傳遞到test的參數是: a = 1, b = 2
```
當使用`Function.prototype`上的`call`或`apply`方法時,函數內的`this`將會被顯式設置為函數調用的第一個參數。
**改變this指向的方法**
JavaScript提供了call、apply、bind這三個方法,來切換/固定this的指向。
**(1)call()**
語法:
```
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
```
定義:調用一個對象的一個方法,以另一個對象替換當前對象。
說明: call 方法可以用來代替另一個對象調用一個方法。call 方法可將一個函數的對象上下文從初始的上下文改變為由 thisObj 指定的新對象。
**(2)apply()**
語法:
```
apply([thisObj[,argArray]])
```
定義:應用某一對象的一個方法,用另一個對象替換當前對象。
說明: 如果 argArray 不是一個有效的數組或者不是 arguments 對象,那么將導致一個 TypeError。 如果沒有提供 argArray 和 thisObj 任何一個參數,那么 Global 對象將被用作 thisObj, 并且無法被傳遞任何參數。 bind()方法 bind()方法是在ECMAScript 5中新增的方法。 toString()方法
函數的toString方法返回函數的源碼。
```
function f(){
return 1;
}
f.toString()
//function f(){
// return 1;
//}
```
**(3)bind()**
bind()方法會創建一個新函數,稱為綁定函數,當調用這個綁定函數時,綁定函數會以創建它時傳入 bind()方法的第一個參數作為 this,傳入 bind() 方法的第二個以及以后的參數加上綁定函數運行時本身的參數按照順序作為原函數的參數來調用原函數。
```
var bar=function(){
console.log(this.x);
}
var foo={
x:3
}
bar();
bar.bind(foo)();
/*或*/
var func=bar.bind(foo);
func();
輸出:
undefined
3
```
注意:bind()返回的是函數。
- 前言
- JavaScript簡介
- 基本概念
- 語法
- 數據類型
- 運算符
- 表達式
- 語句
- 對象
- 數組
- 函數
- 引用類型(對象)
- Object對象
- Array對象
- Date對象
- RegExp對象
- 基本包裝類型(Boolean、Number、String)
- 單體內置對象(Global、Math)
- console對象
- DOM
- DOM-屬性和CSS
- BOM
- Event 事件
- 正則表達式
- JSON
- AJAX
- 表單和富文本編輯器
- 表單
- 富文本編輯器
- canvas
- 離線應用
- 客戶端存儲(Cookie、Storage、IndexedDB)
- HTML5 API
- Video/Audio
- Geolocation API
- requestAnimationFrame
- File API
- FullScreen API
- IndexedDB
- 檢測設備方向
- Blob
- vibrate
- Luminosity API
- WebRTC
- Page Visibility API
- Performance API
- Web Speech
- Notification
- 面向對象的程序設計
- 概述
- this關鍵字
- 原型鏈
- 作用域
- 常用API合集
- SVG
- 錯誤處理機制
- JavaScript開發技巧合集
- 編程風格
- 垃圾回收機制