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 。

ECMAScript 之深入探討 Call()、Apply()、Bind() 與 This

outerThis 為 window 。

  1. 在 Sloppy Mode 下,Function Declaration 的 this 為 window ,因此為 true
  2. 在 Sloppy Mode 下,Anonymous Function 的 this 為 window ,因此為 true
  3. 在 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 。

ECMAScript 之深入探討 Call()、Apply()、Bind() 與 This

outerThis 為 window 。

  1. 在 Strict Mode 下,Function Declaration 的 this 為 undefined ,因此為 false
  2. 在 Strict Mode 下,Anonymous Function 的 this 為 undefined ,因此為 false
  3. 在 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。

ECMAScript 之深入探討 Call()、Apply()、Bind() 與 This

outerThis 為 window 。

  1. 在 Sloppy Mode 下,Function Declaration 的 this 為 window ,因此為 true
  2. 在 Sloppy Mode 下,Function Declaration 的 call() 若傳入 null ,不會影響 this ,一樣是 windows ,因此為 true
  3. 在 Sloopy Mode 下, Function Declaration 的 apply() 若傳入 undefined ,不會影響 this ,一樣是 window ,因此為 true
  4. 在 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。

ECMAScript 之深入探討 Call()、Apply()、Bind() 與 This

outerThis 為 window 。

  1. 在 Strict Mode 下,Function Declaration 的 this 為 undefined ,因此為 false
  2. 在 Strict Mode 下,Function Declaration 的 call() 若傳入 null ,不會影響 this ,一樣是 undefined ,因此為 false
  3. 在 Strict Mode 下, Function Declaration 的 apply() 若傳入 undefined ,不會影響 this ,一樣是 undefined ,因此為 false
  4. 在 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。

ECMAScript 之深入探討 Call()、Apply()、Bind() 與 This

outerThis 為 window 。

  1. 在 Sloppy Mode 下,Anonymous Function 的 this 為 window ,因此為 true
  2. 在 Sloppy Mode 下,Anonymous Function 的 call() 若傳入 null ,不會影響 this ,一樣是 window ,因此為 true
  3. 在 Sloopy Mode 下, Anonymous Function 的 apply() 若傳入 undefined ,不會影響 this ,一樣是 window ,因此為 true
  4. 在 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。

ECMAScript 之深入探討 Call()、Apply()、Bind() 與 This

outerThis 為 window 。

  1. 在 Strict Mode 下,Anonymous Function 的 this 為 undefined ,因此為 false
  2. 在 Strict Mode 下,Anonymous Function 的 call() 若傳入 null ,不會影響 this ,一樣是 undefined ,因此為 false
  3. 在 Strict Mode 下, Anonymous Function 的 apply() 若傳入 undefined ,不會影響 this ,一樣是 undefined ,因此為 false
  4. 在 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。

ECMAScript 之深入探討 Call()、Apply()、Bind() 與 This

outerThis 為 window 。

  1. 在 Sloppy Mode 下,Arrow Function 的 this 為 parent scope 的 window ,因此為 true
  2. 在 Sloppy Mode 下,Arrow Function 的 call() 無論傳入什麼都不會改變 this ,一樣是 window ,因此為 true
  3. 在 Sloopy Mode 下, Arrow Function 的 apply() 無論傳入什麼都不會改變 this ,一樣是 window ,因此為 true
  4. 在 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。

ECMAScript 之深入探討 Call()、Apply()、Bind() 與 This

outerThis 為 window 。

  1. 在 Strict Mode 下,Arrow Function 的 this 為 parent scope 的 window ,因此為 true
  2. 在 Strict Mode 下,Arrow Function 的 call() 無論傳入什麼都不會改變 this ,一樣是 window ,因此為 true
  3. 在 Strict Mode 下, Arrow Function 的 apply() 無論傳入什麼都不會改變 this ,一樣是 window ,因此為 true
  4. 在 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 scope window
  • 無論在 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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

重新定义管理

重新定义管理

[美]布赖恩·罗伯逊 / 中信出版社 / 2015-10-1 / 45

还没听说过合弄制?你一定会听说的。终于,迎来了一本合弄制创建者的著作,讲解了这一公司经营方式的革命性新系统及其实施方法。 今天的商界,情况瞬息万变。但在绝大多数组织中,最具资格响应变化的人们却几乎都没有权力去做出改变。相反,他们不得不遵守那些由领导们设立的亘古不变的战略,而且这些领导们仍然相信“预测和控制”才是有效管理的关键。 合弄制向你展示了怎样让组织中工作的每一个人都成为一名领导,......一起来看看 《重新定义管理》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器