iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 5
0
自我挑戰組

前端工程師的30份套餐系列 第 5

Day5- JavaScript的this

  • 分享至 

  • xImage
  •  

Javascript的this究竟指向誰,這個問題總是被拿出來討論,今天就來看看this指向的不同情況。

1. this指向於調用該函數的物件

公式: 物件.函式();
函式內的this指向該物件

//範例1
var obj = {
    x: 10,
    f: functino(){ console.log(this.x); }
}
obj.f();  //由於調用f函式時,點前面物件為obj,故f內的this指向obj所以輸出為20

//範例2
obj.testobj = {
    x:30,
    f:function(){ console.log(this.x); }
}
obj.testobj.f(); //30

2. this指向全域物件

如果調用函式的前方沒有物件,函式的this則指向全域物件。
(在瀏覽器:window物件,node.js:gobal物件)
公式: 函式();

var x = 10;
var f = function(){
    console.log(this.x);
};
f();   //10

3. this指向call或apply方法所指派給this的物件

這兩個方法可以更動this指派的值,且都是呼叫該函式並讓函式的this指向給予call或apply的第一個參數。
公式:
A物件.函式.call(B物件,參數1,參數2,參數3);
A物件.函式.call(B物件,[參數1,參數2,參數3]);
這兩種方法函式的this指向B物件(若B物件為null,則指向全域物件)

var obj = {
    x:10;
    f:function(){ console.log(this.x); }
}

var obj2 = {
    x:20;
}
obj.f.call(obj2); //利用call指派f的this為指向obj2,所以輸出為20

4. this指向new所產生之新物件

若將函式當作建構式(constructor)來用,則內部的this指向於new所產生之新物件。
公式: new 建構式();

function FoodConstructor () {
  this.Item = '牛排'
}
var myFood = new FoodConstructor();
console.log(myFood.Item); //牛排

重新指向this

在立即函式(IIFE)或是非同步事件(setTimeout)大多都會指向全域,如果要調用的是物件本身的話,可以先用一個變數指向this,等到調用後再重新使用它。

function callName() {
  console.log('區域', this.name);
  var that = this;
  setTimeout(function () {
    console.log('全域', this.name);
    console.log('區域', that.name);
  }, 10);
}
var name = '全域阿婆';
var auntie = {
  name: '漂亮阿姨',
  callName: callName  
  // 這裡的 function 指向全域的 function,但不重要
}
auntie.callName();

參考 卡伯斯的JavaScript的this到底是誰


上一篇
Day4-ES6 箭頭函式
下一篇
Day6-Callback function
系列文
前端工程師的30份套餐30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言