# this指向問題
this應該是第一個讓人對JavaScript困惑的問題了,但是實際上它的原理非常簡單:**函數的this在運行時綁定**。
什么叫運行時綁定?就是函數的this**和你寫在哪里無關**,而是和**誰調用它有關**。誰調用這個函數,this就指向誰。
你現在大概會在想:原來這么簡單,我精通了!
那可就大錯特錯了,可千萬別忘了光函數的調用方法就有兩種:直接調和new一個,而能做這兩個操作的地方可以說非常的多,所以還需要往下看。
注意:以下例子均為嚴格模式下運行,非嚴格模式這里不做考慮。
## 初級
```js
function f1 () {
console.log(this)
}
f1();
```
問結果是什么?先問自己:誰調用的它?你應該一下看不出來,這明明就是直接調的啊!可能有的基礎比較扎實的人會說**是window**,那真是非常的恭喜你了,但你要注意的是以上代碼在嚴格模式下是undefined。
正解: window / undefined
```js
const foo = {
bar: 10,
fn: function() {
console.log(this)
console.log(this.bar)
}
}
let fn1 = foo.fn
fn1()
```
結果是什么?你可能一眼看到fn是定義在foo對象里,那this可不就是foo嗎,剛剛說什么來著,先問自己:**誰調用的它**,來看最后一行再回答一遍。
正解:window / undefined
## 中級
```js
const foo = {
bar: 10,
fn: function() {
console.log(this)
console.log(this.bar)
}
}
foo.fn()
```
現在你應該已經有點感覺了,來,說出來,誰調用的它fn?
正解:foo
## 中級+
```js
const person = {
name: '橙子',
brother: {
name: '河浪',
fn: function() {
return this.name
}
}
}
console.log(person.brother.fn())
```
看能不能過關斬將,誰調用的fn?
正解:brother
## call / bind / apply
此為3種**干預this**指向的操作,限于篇幅不展開講。
## 箭頭函數
箭頭函數可以讓你省很多事,因為它的this一般來說都是符合你的直覺的:它的this就是定義時候的this。
> 本文作者: 不愛喝橙子汁
- 自述
- 學會提問
- 起步
- 安裝
- 版本升級
- 1.x 升級 2.x 常見問題
- 命令行模式下node-sass安裝錯誤
- 查看版本
- uView UI 1.x 相關問題
- 安裝
- Popup 彈窗
- tabs 標簽
- Waterfall 瀑布流
- Table 表格
- Dropdown 下拉菜單
- uview-ui組件篇
- u-upload監聽beforeRead事件無效
- 組件怎么關不了
- 導航欄不默認返回好麻煩
- ref怎么獲取不到
- z-index拉滿都覆蓋不了map
- u-text對手機號脫敏
- u-input的placeholder去不掉
- 服務端返回數據,form表單驗證錯誤
- checkbox增加選中面積
- uview-ui組件篇/checkbox無法取消選中
- 小程序輸入框的placeholder會穿透到彈出層
- JavaScript篇
- 判斷數據類型
- 數組操作
- 節流與防抖函數
- this怎么就不對
- 計算地圖上兩點間的距離
- CSS篇
- 我要超出顯示省略號
- uniapp中小程序樣式穿透問題
- 關鍵幀與動畫
- CSS動畫屬性總結
- 過渡與動畫
- 正則表達式篇
- 身份證號
- 手機號
- 是否合法的http/https域名
- 數據處理篇
- 對數組分組
- 深拷貝對象
- 提取數組屬性
- 提取對象屬性
- 常見問題
- 如何給由組件觸發的事件中傳入自定義的參數
- 分類的雙列聯動
- 三級聯動的實現
- 小程序預覽提示包過大
- 框架安裝失敗
- 表格、瀑布流、下拉列表 組件為什么沒有了
- tabBar組件怎么用
- 時間、日歷、選擇器相關問題
- 字體圖標不顯示
- class 或 /deep/ 不生效