溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JavaScript中this有幾種綁定規(guī)則

發(fā)布時(shí)間:2022-03-03 10:49:06 來源:億速云 閱讀:121 作者:iii 欄目:web開發(fā)

這篇“JavaScript中this有幾種綁定規(guī)則”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“JavaScript中this有幾種綁定規(guī)則”文章吧。

我們先說一個(gè)最簡(jiǎn)單的this在全局指向的是什么呢?

這個(gè)問題很簡(jiǎn)單在瀏覽器中測(cè)試this,全局指向的是window,不過在開發(fā)過程中this很少在全局使用,一般都是在函數(shù)內(nèi)的

this有幾種綁定規(guī)則?

綁定一:默認(rèn)綁定

// 1.案例一: 

function foo() {

   console.log(this)

 }

 foo()//window

// 2.案例二:

function foo1() {

  console.log(this)

}

function foo2() {

  console.log(this)

  foo1()

}

function foo3() {

  console.log(this)

  foo2()

}

foo3()//window

// 3.案例三:

var obj = {

  name: "why",

  foo: function() {

    console.log(this)

  }

}

var bar = obj.foo

bar() // window

綁定二:隱式綁定

// 1.案例一:

var obj = {

  name: "why",

  foo: foo

}

obj.foo() // obj對(duì)象

// 2.案例二:

var obj = {

  age: "哈哈哈",

  eating: function () {

    console.log(this + "在吃東西")

  },

  running: function () {

    console.log(this + "在跑步")

  }

}

obj.eating()//obj對(duì)象

obj.running()//obj對(duì)象

var fn = obj.eating

fn()

//window,為什么是window呢因?yàn)榘裲bj.eating這個(gè)函數(shù)賦值給了fn,fn在全局調(diào)用的所以指向的是window

// 3.案例三:

var obj1 = {

  name: "obj1",

  foo: function () {

    console.log(this)

  }

}

var obj2 = {

  name: "obj2",

  bar: obj1.foo

}

obj2.bar()//obj2對(duì)象

綁定三:顯示綁定

function foo() {

  console.log("函數(shù)被調(diào)用了", this)

}

//1.foo直接調(diào)用和call/apply調(diào)用的不同在于this綁定的不同

//foo直接調(diào)用指向的是全局對(duì)象(window)

foo()

var obj = {

  name: "obj",

  // age:foo//可以簡(jiǎn)寫這一步

}

//call/apply是可以指定this的綁定對(duì)象

foo.call(obj)//obj對(duì)象

foo.apply(obj)//obj對(duì)象

foo.apply("aaaa")//aaaa

// 2.call和apply有什么區(qū)別?

function sum(num1, num2, num3) {

  console.log(num1 + num2 + num3, this)

}

sum.call("call", 20, 30, 40)//傳遞參數(shù)后面可以傳無限個(gè)數(shù)值,都是用逗號(hào)分割

sum.apply("apply", [20, 30, 40])//傳遞參數(shù)用數(shù)組接收,一樣可以傳無限個(gè)數(shù)值,用逗號(hào)分割

// 3.call和apply在執(zhí)行函數(shù)時(shí),是可以明確的綁定this, 這個(gè)綁定規(guī)則稱之為顯示綁定

綁定四:new綁定

// 我們通過一個(gè)new關(guān)鍵字調(diào)用一個(gè)函數(shù)時(shí)(構(gòu)造器), 這個(gè)時(shí)候this是在調(diào)用這個(gè)構(gòu)造器時(shí)創(chuàng)建出來的對(duì)象

// this = 創(chuàng)建出來的對(duì)象

// 這個(gè)綁定過程就是new 綁定

function Person(name, age) {

  this.name = name

  this.age = age

}

var p1 = new Person("哈哈哈", 18)

console.log(p1.name, p1.age)//哈哈哈,18

var p2 = new Person("呵呵呵", 30)

console.log(p2.name, p2.age)//呵呵呵,30

這些的案例可以給我們什么樣的啟示呢?

1.函數(shù)在調(diào)用時(shí),JavaScript會(huì)默認(rèn)給this綁定一個(gè)值;

2.this的綁定和定義的位置(編寫的位置)沒有關(guān)系;

3.this的綁定和調(diào)用方式以及調(diào)用的位置有關(guān)系;

4.this是在運(yùn)行時(shí)被綁定的;

最后說一下默認(rèn)綁定和顯示綁定bind沖突: 優(yōu)先級(jí)(顯示綁定)

以上就是關(guān)于“JavaScript中this有幾種綁定規(guī)則”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI