iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 19
0
Modern Web

用30天了解javascript系列 第 19

[用30天了解javascript]Day19.this

  • 分享至 

  • xImage
  •  
  • 不管在全域或函式,都可以直接調用this,在每個執行環境都會存在,this 代表的是執行時的對象,並不代表自身。
  • 在全域環境中,this會指向window
  • this與函式如何宣告沒有關聯性,與呼叫函式方法有關

this調用方式

函式調用

最常使用的方法,物件的方法調用時,須注意在哪個物件下呼叫

var fullarea = 'fullarea';
function callFullArea(fullarea) {
  var area = fullarea;
  var full = this.fullarea
  console.log(area, full); //area fullarea
}
callFullArea('area');

https://ithelp.ithome.com.tw/upload/images/20200919/20112053K9L4CiYTOf.png
函式調用(window調用),this指向window物件,因此this.fullarea會是全域變數的fullarea

要看this指向何處,可直接印出來看看

(function callFunc() {
  console.log(this);
})();
var func = function callFunc() {
  console.log(this);
}
var newfunc = func;

https://ithelp.ithome.com.tw/upload/images/20201003/20112053ATYOyY9u6o.png

方法調用

var userInfo = {
	firstName: 'Chen',
  lastName: 'Jay',
	fullName: function(){ 
		console.log(this.firstName + ' ' + this.lastName);
	}
}
userInfo.fullName();//Jay Chen
//this指向userInfo

建構式呼叫:

  • 透過new建立 > 連接物件 > this會指向新物件
  • 使用建構式的命名採單字首字大寫
function UserInfo(lastName, firstName){
	this.firstName = firstName;
	this.lastName = lastName;
}
var jayInfo = new UserInfo('Jay','Chen');
console.log(jayInfo);

var janeInfo = new UserInfo('Jane','Wang');
console.log(jayInfo);

call()、 apply()、 bind()

call()、apply()是改變 this 指向的物件,直接執行一個 function

bind()是綁定 this 指向的物件,用來建立一個新的 function

call(),會立刻執行

fun.call(obj, val1, val2);

apply(),以陣列形式傳入

function.apply(obj, [val1, val2]);

bind(),呼叫完不會立刻執行,要調用它

fun.bind(obj, val1, val2)(); fun.bind(obj)(val1, val2);
var company = {
    department: 'depart-a'
};
function Employee (name, age) {
    console.log(this, name, age);
}
Employee.call(company, 'Jay', 32);
Employee.call(undefind, 'Jay', 32);
//呼叫fun時提供this值。參數不傳或者傳 null 、undefined,默認 this 指向全局對象(非嚴格模式)或 undefined(嚴格模式)
Employee.apply(company, ['Amy', 24]);

var Employee2 = Employee.bind(company, 'Jason', 22);
Employee2();

嚴格模式

使用"use strict"可以撰寫出較嚴謹的js,可防止一些不合理、不嚴謹之處,像是設定變數未定義,提高編譯器效率,增加執行速度。

"use strict";
function userInfo() {
    name = 'Joe'; //報錯 name未定義
}
userInfo();

上一篇
[用30天了解javascript]Day18.閉包
下一篇
[ 用30天了解javascript]Day20.箭頭函式
系列文
用30天了解javascript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言