亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JavaScript之this

Yang_River / 702人閱讀

摘要:的指向只和函數(shù)的調(diào)用位置方式有關(guān),和函數(shù)聲明的位置無(wú)關(guān)。全局瀏覽器全局這是中的默認(rèn)綁定,在全局上下文中,會(huì)默認(rèn)綁定到全局對(duì)象。同時(shí)上面四條綁定規(guī)則在箭頭函數(shù)中不適用,使得的查找更可控。

本文共 1065 字,讀完只需 4 分鐘
概述

在 JAVA 中,this 的概念很透徹,就是指向當(dāng)前對(duì)象(方法和屬性的持有者),在編譯的時(shí)候就能確定 this 指代,而由于 JavaScript 中 this 是動(dòng)態(tài)綁定,或稱為運(yùn)行期綁定的,在絕大多數(shù)情況下,函數(shù)的調(diào)用方式?jīng)Q定了 this 的值,所以在 JS 中不能在定義時(shí)決定地定義 this 是哪個(gè)上下文對(duì)象。

this 的指向只和函數(shù)的調(diào)用位置(方式)有關(guān),和函數(shù)聲明的位置無(wú)關(guān)。

本文就從 this 應(yīng)用場(chǎng)景調(diào)用方式的角度,解析 this 的用法。

首先,要知道,this 的作用是什么?

函數(shù)體內(nèi)部,指代函數(shù)當(dāng)前的運(yùn)行上下文。
一、全局上下文

在全局上下文中,this 指向全局對(duì)象,在瀏覽器中指向 window,在 NodeJs 中指向 global。

var a = "全局";
console.log(this)  // 瀏覽器:window
console.log(this)  // nodejs:global
console.log(this.a)  // "全局"

這是 JS 中的默認(rèn)綁定,在全局上下文中,this 會(huì)默認(rèn)綁定到 全局對(duì)象。

二、函數(shù)聲明

在非嚴(yán)格模式下,未加關(guān)鍵字 var 聲明的變量,會(huì)成為全局對(duì)象下的屬性,所以,此時(shí)
在嚴(yán)格模式下,this 將保持他進(jìn)入執(zhí)行上下文時(shí)的值,所以下面的 this 將會(huì)默認(rèn)為 undefined。

function foo() {
    "use strict";
    console.log(this);
}

foo();  // undefined 嚴(yán)格模式

上述也是 JS 中 this 的默認(rèn)綁定,在函數(shù)定義中,函數(shù)中的 this 會(huì)默認(rèn)綁定到全局對(duì)象或者 undefined。

當(dāng)函數(shù)作為對(duì)象里的方法被調(diào)用時(shí),函數(shù)中 this 是調(diào)用該函數(shù)的對(duì)象。
function foo() {
    console.log("foo");
}

var obj = {
    this.bar = "bar";
    this.foo = foo;
}

obj.foo(); // "foo"

在調(diào)用位置,是 obj 對(duì)象調(diào)用了 foo 函數(shù),此時(shí) this 就指向了 obj 對(duì)象。

function foo() {
    console.log(this.bar);
}

var obj2 =  {
    bar: "2",
    foo: foo
}

var obj1 = {
    bar: "1",
    obj2: obj2
}

obj1.obj2.foo()  // "2";

這是 JS 中 this 的隱式綁定,this 會(huì)隱式綁定到調(diào)用的最近一層上下文對(duì)象。

三、call & apply

其實(shí)在函數(shù)中,函數(shù)正確的調(diào)用應(yīng)該是用 call, apply 函數(shù)的形式。

function foo() {
    console.log(this.bar);
}

let obj = {
    bar: "1",
    foo: foo
}

obj.foo();  // `.` 點(diǎn)調(diào)用其實(shí)是語(yǔ)法糖

foo.call(obj)  // 1 正確的姿勢(shì)
foo.apply(obj) // 1

這是 JS 中 this 的顯式綁定,函數(shù)通過(guò)從 call 和 apply 函數(shù)可以顯式指定函數(shù)的調(diào)用對(duì)象。

ES5 提供了一個(gè) bind()方法:

let obj2 = {
    a: 2
}

let foo = function () {
    console.log(this.a);
}

let bar = foo.bind(obj2);
bar() // 2;

就是 JS 中 this 的硬綁定,bind() 函數(shù)會(huì)返回一個(gè)指定了調(diào)用對(duì)象的函數(shù),返回的函數(shù)的被指定了 this 且 this 無(wú)法改變。

四、構(gòu)造函數(shù)

當(dāng)函數(shù)加上關(guān)鍵字 new 后,函數(shù)會(huì)變成一個(gè)構(gòu)造函數(shù),此時(shí)構(gòu)造函數(shù)中的 this 指向即將創(chuàng)建的對(duì)象實(shí)例,同時(shí)對(duì)象實(shí)例會(huì)關(guān)聯(lián)到構(gòu)造函數(shù)的原型對(duì)象 prototype 上。

function Foo() {
    this.a = 3;
}

var obj = new Foo();

obj.a // 3
五、箭頭函數(shù)

ES6 中,提供了函數(shù)定義的語(yǔ)法糖,讓定義函數(shù)變得更簡(jiǎn)潔(沒(méi)有 arguments, 沒(méi)有原型)。同時(shí)上面四條綁定規(guī)則在箭頭函數(shù)中不適用,使得 this 的查找更可控。

// 一般函數(shù):
var a = 1;
var obj = {
  a: 2,
  say: function() {
    console.log(this.a)
  }
}
obj.say();  // console.log 打印值為 2

// 箭頭函數(shù)
var a = 1;
var obj = {
  a: 2,
  say: () => {
    console.log(this.a)
  }
}
obj.say(); // 1   !!!

由于箭頭函數(shù)定義時(shí), obj {} 不是執(zhí)行上下文,say 變量引用的箭頭函數(shù),其 this 是父級(jí)執(zhí)行上下文,也就是全局上下文,所以 this.a 就是 全局變量 a: 1;

在箭頭函數(shù)中,this 與封閉詞法上下文的 this 保持一致,this 被永久綁定到了它最近一層非箭頭函數(shù)的 this,而與函數(shù)的調(diào)用位置無(wú)關(guān)。

總結(jié)

在絕大多數(shù)情況下,函數(shù)的調(diào)用方式?jīng)Q定了 this 的值,但最終都指向了調(diào)用了它的那個(gè)上下文對(duì)象。

歡迎關(guān)注我的個(gè)人公眾號(hào)“謝南波”,專注分享原創(chuàng)文章。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/98533.html

相關(guān)文章

  • JavaScript深入執(zhí)行上下文

    摘要:深入系列第七篇,結(jié)合之前所講的四篇文章,以權(quán)威指南的為例,具體講解當(dāng)函數(shù)執(zhí)行的時(shí)候,執(zhí)行上下文棧變量對(duì)象作用域鏈?zhǔn)侨绾巫兓?。前言在深入之?zhí)行上下文棧中講到,當(dāng)代碼執(zhí)行一段可執(zhí)行代碼時(shí),會(huì)創(chuàng)建對(duì)應(yīng)的執(zhí)行上下文。 JavaScript深入系列第七篇,結(jié)合之前所講的四篇文章,以權(quán)威指南的demo為例,具體講解當(dāng)函數(shù)執(zhí)行的時(shí)候,執(zhí)行上下文棧、變量對(duì)象、作用域鏈?zhǔn)侨绾巫兓摹?前言 在《Jav...

    gougoujiang 評(píng)論0 收藏0
  • JavaScript深入bind的模擬實(shí)現(xiàn)

    摘要:也就是說(shuō)當(dāng)返回的函數(shù)作為構(gòu)造函數(shù)的時(shí)候,時(shí)指定的值會(huì)失效,但傳入的參數(shù)依然生效。構(gòu)造函數(shù)效果的優(yōu)化實(shí)現(xiàn)但是在這個(gè)寫(xiě)法中,我們直接將,我們直接修改的時(shí)候,也會(huì)直接修改函數(shù)的。 JavaScript深入系列第十一篇,通過(guò)bind函數(shù)的模擬實(shí)現(xiàn),帶大家真正了解bind的特性 bind 一句話介紹 bind: bind() 方法會(huì)創(chuàng)建一個(gè)新函數(shù)。當(dāng)這個(gè)新函數(shù)被調(diào)用時(shí),bind() 的第一個(gè)參數(shù)...

    FingerLiu 評(píng)論0 收藏0
  • JavaScript深入new的模擬實(shí)現(xiàn)

    摘要:深入系列第十二篇,通過(guò)的模擬實(shí)現(xiàn),帶大家揭開(kāi)使用獲得構(gòu)造函數(shù)實(shí)例的真相一句話介紹運(yùn)算符創(chuàng)建一個(gè)用戶定義的對(duì)象類型的實(shí)例或具有構(gòu)造函數(shù)的內(nèi)置對(duì)象類型之一也許有點(diǎn)難懂,我們?cè)谀M之前,先看看實(shí)現(xiàn)了哪些功能。 JavaScript深入系列第十二篇,通過(guò)new的模擬實(shí)現(xiàn),帶大家揭開(kāi)使用new獲得構(gòu)造函數(shù)實(shí)例的真相 new 一句話介紹 new: new 運(yùn)算符創(chuàng)建一個(gè)用戶定義的對(duì)象類型的實(shí)例或具...

    tianlai 評(píng)論0 收藏0
  • JavaScript深入繼承的多種方式和優(yōu)缺點(diǎn)

    摘要:深入系列第十五篇,講解各種繼承方式和優(yōu)缺點(diǎn)。優(yōu)點(diǎn)融合原型鏈繼承和構(gòu)造函數(shù)的優(yōu)點(diǎn),是中最常用的繼承模式。寄生組合式繼承為了方便大家閱讀,在這里重復(fù)一下組合繼承的代碼組合繼承最大的缺點(diǎn)是會(huì)調(diào)用兩次父構(gòu)造函數(shù)。 JavaScript深入系列第十五篇,講解JavaScript各種繼承方式和優(yōu)缺點(diǎn)。 寫(xiě)在前面 本文講解JavaScript各種繼承方式和優(yōu)缺點(diǎn)。 但是注意: 這篇文章更像是筆記,哎...

    JackJiang 評(píng)論0 收藏0
  • 學(xué)習(xí)JavaScriptthis,call,apply

    摘要:在全局對(duì)象中調(diào)用,自然讀取的是全局對(duì)象的值構(gòu)造器調(diào)用說(shuō)明作為構(gòu)造器調(diào)用時(shí),指向返回的這個(gè)對(duì)象。最直觀的表現(xiàn)就是,去看一些優(yōu)秀框架的源代碼時(shí),不再是被繞的暈乎乎的。 學(xué)習(xí)起因: 在之前的JavaScript學(xué)習(xí)中,this,call,apply總是讓我感到迷惑,但是他們的運(yùn)用又非常的廣泛。遂專門(mén)花了一天,來(lái)弄懂JavaScript的this,call,apply。中途參考的書(shū)籍也很多,以...

    wenhai.he 評(píng)論0 收藏0
  • JavaScript深入創(chuàng)建對(duì)象的多種方式以及優(yōu)缺點(diǎn)

    摘要:深入系列第十四篇,講解創(chuàng)建對(duì)象的各種方式,以及優(yōu)缺點(diǎn)。也就是說(shuō)打著構(gòu)造函數(shù)的幌子掛羊頭賣(mài)狗肉,你看創(chuàng)建的實(shí)例使用都無(wú)法指向構(gòu)造函數(shù)這樣方法可以在特殊情況下使用。 JavaScript深入系列第十四篇,講解創(chuàng)建對(duì)象的各種方式,以及優(yōu)缺點(diǎn)。 寫(xiě)在前面 這篇文章講解創(chuàng)建對(duì)象的各種方式,以及優(yōu)缺點(diǎn)。 但是注意: 這篇文章更像是筆記,因?yàn)椤禞avaScript高級(jí)程序設(shè)計(jì)》寫(xiě)得真是太好了! 1....

    Terry_Tai 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<