ECMAScript 之深入探討 Call()、Apply()、Bind() 與 This
栏目: JavaScript · 发布时间: 7年前
内容简介:ECMAScript 的一大特色是 Function 能透過ECMAScript 5ECMAScript 2015
ECMAScript 的一大特色是 Function 能透過 call() 、 apply() 與 bind() 去動態改變 this ,尤其在寫 Vue 時特別重要,因為 Vue 預設會將 this 指向 Vue Instance,若你自行抽 function 時,觀念不清楚很容易使 this 就指向 undefined ,所以寫 Vue 一定要搞清楚 ECMAScript 的 this 。
Version
ECMAScript 5
ECMAScript 2015
Scope
Sloppy Mode
const outerThis = this;
function func1() {
console.log(this === outerThis);
}
const func2 = function() {
console.log(this === outerThis);
};
const func3 = () => {
console.log(this === outerThis);
};
func1();
func2();
func3();
在 Sloppy Mode 分別以 Function Declaration、Anonymous Function 與 Arrow Function 三種方式檢視 this 。
outerThis 為 window 。
- 在 Sloppy Mode 下,Function Declaration 的
this為window,因此為true - 在 Sloppy Mode 下,Anonymous Function 的
this為window,因此為true - 在 Sloppy Mode 下,Arrow Function 的
this為 parent scope 的window,因此為true
Strict Mode
"use strict";
const outerThis = this;
function func1() {
console.log(this === outerThis);
}
const func2 = function() {
console.log(this === outerThis);
};
const func3 = () => {
console.log(this === outerThis);
};
func1();
func2();
func3();
在 Strict Mode 分別以 Function Declaration、Anonymous Function 與 Arrow Function 三種方式檢視 this 。
outerThis 為 window 。
- 在 Strict Mode 下,Function Declaration 的
this為undefined,因此為false - 在 Strict Mode 下,Anonymous Function 的
this為undefined,因此為false - 在 Strict Mode 下,Arrow Function 的
this為 parent scope 的window,因此為true
Function Declaration 與 Anonymous Function 在 Sloppy Mode 與 Strict Mode 下的 this 意義不一樣,分別是 window 與 undefined ;但 Arrow Function 在 Sloppy Mode 與 Strict Mode 下的 this 始終都是 parent scope 的 window
Function Declaration
Sloppy Mode
const outerThis = this;
function func() {
console.log(this === outerThis);
}
func();
func.call(null);
func.apply(undefined);
func.bind({})();
在 Sloppy Mode 分別以 call() 、 apply() 與 bind() 執行 Function Declaration。
outerThis 為 window 。
- 在 Sloppy Mode 下,Function Declaration 的
this為window,因此為true - 在 Sloppy Mode 下,Function Declaration 的
call()若傳入null,不會影響this,一樣是windows,因此為true - 在 Sloopy Mode 下, Function Declaration 的
apply()若傳入undefined,不會影響this,一樣是window,因此為true - 在 Sloopy Mode 下,Function Declaration 的
bind()若傳入null與undefined以外的值,如 empty object{},this變成{},因此為false
Strict Mode
"use strict";
const outerThis = this;
function func() {
console.log(this === outerThis);
}
func();
func.call(null);
func.apply(undefined);
func.bind({})();
在 Strict Mode 分別以 call() 、 apply() 與 bind() 執行 Function Declaration。
outerThis 為 window 。
- 在 Strict Mode 下,Function Declaration 的
this為undefined,因此為false - 在 Strict Mode 下,Function Declaration 的
call()若傳入null,不會影響this,一樣是undefined,因此為false - 在 Strict Mode 下, Function Declaration 的
apply()若傳入undefined,不會影響this,一樣是undefined,因此為false - 在 Strict Mode 下,Function Declaration 的
bind()若傳入null與undefined以外的值,如 empty object{},this變成{},因此為false
無論在 Sloppy Mode 或 Strict Mode 下, call() 、 apply() 與 bind() 傳入 null 或 undefined 都不會改變 this
Anonymous Function
Sloppy Mode
const outerThis = this;
const func = function() {
console.log(this === outerThis);
};
func();
func.call(null);
func.apply(undefined);
func.bind({})();
在 Sloppy Mode 分別以 call() 、 apply() 與 bind() 執行 Anonymous Function。
outerThis 為 window 。
- 在 Sloppy Mode 下,Anonymous Function 的
this為window,因此為true - 在 Sloppy Mode 下,Anonymous Function 的
call()若傳入null,不會影響this,一樣是window,因此為true - 在 Sloopy Mode 下, Anonymous Function 的
apply()若傳入undefined,不會影響this,一樣是window,因此為true - 在 Sloopy Mode 下,Anonymous Function 的
bind()若傳入null與undefined以外的值,如 empty object{},this變成{},因此為false
Strict Mode
"use strict"
const outerThis = this;
const func = function() {
console.log(this === outerThis);
};
func();
func.call(null);
func.apply(undefined);
func.bind({})();
在 Strict Mode 分別以 call() 、 apply() 與 bind() 執行 Anonymous Function。
outerThis 為 window 。
- 在 Strict Mode 下,Anonymous Function 的
this為undefined,因此為false - 在 Strict Mode 下,Anonymous Function 的
call()若傳入null,不會影響this,一樣是undefined,因此為false - 在 Strict Mode 下, Anonymous Function 的
apply()若傳入undefined,不會影響this,一樣是undefined,因此為false - 在 Strict Mode 下,Anonymous Function 的
bind()若傳入null與undefined以外的值,如 empty object{},this變成{},因此為false
Function Declaration 與 Anonymous Function 對於 call() 、 apply() 與 bind() 對 this 的影響都是一樣的,無論是 Sloppy Mode 或 Strict Mode
Arrow Function
Sloppy Mode
const outerThis = this;
const func = () => {
console.log(this === outerThis);
};
func();
func.call(null);
func.apply(undefined);
func.bind({})();
在 Sloppy Mode 分別以 call() 、 apply() 與 bind() 執行 Arrow Function。
outerThis 為 window 。
- 在 Sloppy Mode 下,Arrow Function 的
this為 parent scope 的window,因此為true - 在 Sloppy Mode 下,Arrow Function 的
call()無論傳入什麼都不會改變this,一樣是window,因此為true - 在 Sloopy Mode 下, Arrow Function 的
apply()無論傳入什麼都不會改變this,一樣是window,因此為true - 在 Sloppy Mode 下,Arrow Function 的
bind()無論傳入什麼都不會改變this,一樣是window,因此為true
Strict Mode
"use strict";
const outerThis = this;
const func = () => {
console.log(this === outerThis);
};
func();
func.call(null);
func.apply(undefined);
func.bind({})();
在 Strict Mode 分別以 call() 、 apply() 與 bind() 執行 Arrow Function。
outerThis 為 window 。
- 在 Strict Mode 下,Arrow Function 的
this為 parent scope 的window,因此為true - 在 Strict Mode 下,Arrow Function 的
call()無論傳入什麼都不會改變this,一樣是window,因此為true - 在 Strict Mode 下, Arrow Function 的
apply()無論傳入什麼都不會改變this,一樣是window,因此為true - 在 Strict Mode 下,Arrow Function 的
bind()無論傳入什麼都不會改變this,一樣是window,因此為true
無論是 call() 、 apply() 或 bind() ,甚至於 Sloppy Mode 或 Strict Mode,都無法改變 this
Conclusion
- 在 Sloppy Mode 的 Function Declaration 或 Anonymous Function,
this為window - 在 Strict Mode 的 Function Declaration 或 Anonymous Function,
this為undefined - 無論在 Sloppy Mode 或 Strict Mode,Arrow Function 的
this皆為 parent scopewindow - 無論在 Sloppy Mode 或 Strict Mode,將
null或undefined透過call()、apply()或bind()傳入 Function Declaration 或 Anonymous Function,皆無法改變this - 無論在 Sloppy Mode 或 Strict Mode,都無法透過
call()、apply()或bind()改變 Arrow Function 的this
Reference
Egghead.io , Understanding JavaScript’s this Keyword in Depth
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 【1】JavaScript 基础深入——数据类型深入理解与总结
- 深入理解 Java 函数式编程,第 5 部分: 深入解析 Monad
- 深入理解 HTTPS
- 深入理解 HTTPS
- 深入浅出Disruptor
- 深入了解 JSONP
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C语言的科学和艺术
罗伯茨 / 翁惠玉 / 机械工业出版社 / 2005-3 / 55.00元
《C语言的科学和艺术》是计算机科学的经典教材,介绍了计算机科学的基础知识和程序设计的专门知识。《C语言的科学和艺术》以介绍ANSI C为主线,不仅涵盖C语言的基本知识,而且介绍了软件工程技术以及如何应用良好的程序设计风格进行开发等内容。《C语言的科学和艺术》采用了库函数的方法,强调抽象的原则,详细阐述了库和模块化开发。此外,《C语言的科学和艺术》还利用大量实例讲述解决问题的全过程,对开发过程中常见......一起来看看 《C语言的科学和艺术》 这本书的介绍吧!