国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

用最簡單的方法判斷JavaScript中this的指向(推薦)

2024-05-06 16:39:27
字體:
供稿:網(wǎng)友

都說 JavaScript 是一種很靈活的語言,這其實也可以說它是一個混亂的語言。它把 函數(shù)式編程 和 面向?qū)ο缶幊?糅合一起,再加上 動態(tài)語言 特性,簡直強大無比(其實是不能和C++比的,^_^ )。

JS 里的 this

  • 在 function 內(nèi)部被創(chuàng)建
  • 指向調(diào)用時所在函數(shù)所綁定的對象(拗口)
  • this 不能被賦值,但可以被 call/apply  改變

目錄

* 一個特例
* 開始判斷
    * 法則一:對象方法中的this指向?qū)ο蟊旧恚^函數(shù)形式的除外)
    * 法則二:多層嵌套函數(shù)中的this指向等同于包含該this的最近一個function的this
    * 法則三:箭頭函數(shù)以及非指向?qū)ο蠓椒ㄖ械膄unction的情況下this指向window
* 習(xí)題集
    * 普通函數(shù)中的this
    * 函數(shù)執(zhí)行后返回另外一個函數(shù)中的this(普通函數(shù)中)
    * 多層嵌套函數(shù)中的this(定時器&箭頭函數(shù))1
    * 多層嵌套函數(shù)中的this(定時器&箭頭函數(shù))2

一個特例

在正式開始之前,我們先來說一個特例。

// 構(gòu)造函數(shù)function Student(name) { this.name = name}// 創(chuàng)建小明和小紅兩個實例var XM = new Student('xiaoming')var XH = new Student('xiaohong')// 輸出信息console.log(XM) // Student {name: "xiaoming"}console.log(XH) // Student {name: "xiaohong"}

在構(gòu)造函數(shù)中,this上的值會在創(chuàng)建實例的時候被綁定到新創(chuàng)建的實例上。不適用于下面的判斷方法,所以特此說明。

開始判斷

下面是一個典型例子,我們的分析從這里開始。

var x = { name: 'bw2', getName1: function() { console.log(this) }, getName2: function() { setTimeout(() => {  console.log(this) },0) }, getName31: () => { console.log(this) }, getName32: function() { return function() {  console.log(this) } }}x.getName1() // {name: "bw2", getName1: ƒ}x.getName2() // {name: "bw2", getName1: ƒ}x.getName31() // Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}x.getName32()() // Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}

法則一:對象方法中的this指向?qū)ο蟊旧恚^函數(shù)形式的除外)

var x = { name: 'bw2', getName1: function() { console.log(this) }}x.getName1() // {name: "bw2", getName1: ƒ}

法則二:多層嵌套函數(shù)中的this指向等同于包含該this的最近一個function的this

箭頭函數(shù)沒有獨立的this作用域,所以繼續(xù)往外層走,走到了getName: function(){}。那么就是他了,this指向等同于這個function內(nèi)部的this指向。根據(jù)法則一,this指向?qū)ο蟊旧怼?/p>

var x = { name: 'bw2', getName2: function() { console.log(this) // 等同于此處的this setTimeout(() => {  console.log(this) // 原始的this位置 },0) }}x.getName2() // {name: 'bw2', getName1: ƒ}

我們可以試著在瀏覽器中運行,看看結(jié)果。

法則三:箭頭函數(shù)以及非指向?qū)ο蠓椒ㄖ械膄unction的情況下this指向window

根據(jù)法則二,this是指向最近的function,因此,這里的this等同于返回的函數(shù)中的this,不是對象方法中的this,所以,指向全局。

是不是感覺有點奇怪?不過實踐證明確實如此。

var x = { name: 'bw2', getName31: () => { console.log(this) }, getName32: function() { return function() {  console.log(this) } }}x.getName31() // Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}x.getName32()() // Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}

習(xí)題集

歡迎大家按照法則一到三依次判斷,猜測結(jié)果,并在瀏覽器下測試。測試結(jié)果也可以回復(fù),大家一起討論。

因本人能力有限,該系列法則可能在部分情況下失效。歡迎大家一起討論。

下面是做題時間。

普通函數(shù)中的this

function x() { console.log(this)}x()

函數(shù)執(zhí)行后返回另外一個函數(shù)中的this(普通函數(shù)中)

function xx(){ return function() { console.log(this) }}xx()()

多層嵌套函數(shù)中的this(定時器&箭頭函數(shù))1

var x = { name: 'bw2', getName: () => { setTimeout(() => {  console.log(this) },0) }}x.getName()

多層嵌套函數(shù)中的this(定時器&箭頭函數(shù))2

var x = { name: 'bw2', getName: () => { setTimeout(function() {  console.log(this) },0) }}x.getName()

再次說明,該法則為實驗性法則,未進行大范圍的測試,不保證在所有情況下都有一致的結(jié)果。如果你發(fā)現(xiàn)了法則判斷失敗的情況,歡迎留言,一起探討。

總結(jié)

以上所述是小編給大家介紹的Mysql 5.7.19 winx64 ZIP Archive 安裝及使用教程,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對VeVb武林網(wǎng)網(wǎng)站的支持!


注:相關(guān)教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 高阳县| 基隆市| 平武县| 井研县| 石首市| 云南省| 柳河县| 稻城县| 墨玉县| 定日县| 应用必备| 左贡县| 清流县| 齐齐哈尔市| 柳州市| 哈密市| 新平| 克拉玛依市| 南召县| 湖北省| 离岛区| 海阳市| 衡水市| 谢通门县| 林西县| 依安县| 资中县| 昂仁县| 乐山市| 阿合奇县| 阜平县| 盐城市| 阜新市| 德惠市| 镇坪县| 乐昌市| 乡城县| 内丘县| 阳信县| 肥城市| 南召县|