ECMAScript 之深入探討 Call()、Apply()、Bind() 與 This
栏目: JavaScript · 发布时间: 6年前
内容简介: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
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Android和PHP开发最佳实践
黄隽实 / 机械工业出版社华章公司 / 2013-3-20 / 79.00元
本书是国内第一本同时讲述Android客户端开发和PHP服务端开发的经典著作。 本书以一个完整的微博应用项目实例为主线,由浅入深地讲解了Android客户端开发和PHP服务端开发的思路和技巧。从前期的产品设计、架构设计,到客户端和服务端的编码实现,再到性能测试和系统优化,以及最后的打包发布,完整地介绍了移动互联网应用开发的过程。同时,本书也介绍了Android系统中比较有特色的功能,比如Go......一起来看看 《Android和PHP开发最佳实践》 这本书的介绍吧!