摘要:含義既不指向函數(shù)本身,也不指向函數(shù)的詞法作用域。運(yùn)行時(shí)動(dòng)態(tài)綁定,并不是編寫綁定,上下文取決于函數(shù)調(diào)用的各種條件。
含義
既不指向函數(shù)本身,也不指向函數(shù)的詞法作用域。
運(yùn)行時(shí)動(dòng)態(tài)綁定,并不是編寫綁定,上下文取決于函數(shù)調(diào)用的各種條件。
指向取決于函數(shù)被調(diào)用的位置,也是在函數(shù)調(diào)用時(shí)候發(fā)生綁定。
解析 調(diào)用棧(可以比擬成函數(shù)調(diào)用鏈)指到達(dá)當(dāng)前執(zhí)行位置所調(diào)用的所有函數(shù)
so調(diào)用位置(函數(shù)被調(diào)用的位置,而不是聲明位置)就是當(dāng)前執(zhí)行函數(shù)的前一個(gè)調(diào)用
function foo() { // 當(dāng)前調(diào)用棧 => foo // 當(dāng)前調(diào)用位置 => global全局作用域 console.log("foo") bar() // bar調(diào)用位置 } function bar() { // 當(dāng)前調(diào)用棧 => foo -> bar // 當(dāng)前調(diào)用位置 foo console.log("bar") }綁定規(guī)則
默認(rèn) => 獨(dú)立函數(shù)調(diào)用
this默認(rèn)綁定,指向全局對(duì)象
隱式 => 是否存在上下文 / 被某個(gè)對(duì)象擁有或包含
當(dāng)函數(shù)引用存在上下文,this會(huì)被隱式綁定到這個(gè)上下文對(duì)象
對(duì)象屬性引用鏈只對(duì)調(diào)用位置的(上一層 / 最后一層)有效
function foo() { return this.a } const obj = { a: "hello", foo, // 函數(shù)引用,當(dāng)前上下文是obj } obj.foo()
顯式綁定 => call, apply, bind
硬綁定
function foo() { return this.a } const obj = { a: "hello } const bar = function() { foo.call(obj) // 顯式的強(qiáng)制綁定 } setTimeout(bar, 300) bar.call(window) // 2 => 硬綁定之后this無法再修改
new綁定 => 構(gòu)造函數(shù)調(diào)用,實(shí)際上并不存在“構(gòu)造函數(shù)”,是對(duì)函數(shù)的“構(gòu)造調(diào)用”
創(chuàng)建(構(gòu)造)一個(gè)全新的對(duì)象
這個(gè)對(duì)象會(huì)被執(zhí)行[[Prototype]]連接
這個(gè)對(duì)象會(huì)綁定到函數(shù)調(diào)用的this
如果函數(shù)沒有返回對(duì)象,直接返回這個(gè)新對(duì)象
注意點(diǎn)隱式綁定會(huì)丟失綁定對(duì)象,從而應(yīng)用默認(rèn)綁定,分別有以下兩種情況。
函數(shù)別名 => 引用函數(shù)本身,so默認(rèn)綁定
function foo() { return this.a } const obj = { a: "hello", foo, // 函數(shù)引用,當(dāng)前上下文是obj } const a = "on no, this is global" const bar = obj.foo // 函數(shù)別名 bar() // "on no, this is global"
參數(shù)傳遞 => 隱式賦值,同上
function foo() { return this.a } function doFoo(fn) { fn() // fn => foo } const obj = { a: "hello", foo, // 函數(shù)引用,當(dāng)前上下文是obj } const a = "on no, this is global" doFoo(obj.foo) // "on no, this is global"優(yōu)先級(jí)
顯式 > 隱式
new > 隱式
new可以修改顯式的this
function foo(some) { this.a = some } const obj = {} const bar = foo.bind(obj) bar(2) console.log(obj.a) // 2 const baz = new bar(3) console.log(obj.a) // 2 console.log(baz.a) // 3 => new 修改了this綁定
new中使用硬綁定 => 函數(shù)柯理化
function foo(a, b) { this.value = a + b } const bar = foo.bind(null, "hello ") //這里 this不指定,new時(shí)會(huì)修改 const baz = new bar("world") baz.value // "hello world"
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/92515.html
摘要:作為構(gòu)造函數(shù)調(diào)用中沒有類,但是可以從構(gòu)造器中創(chuàng)建對(duì)象,并提供了運(yùn)算符來進(jìn)行調(diào)用該構(gòu)造器。構(gòu)造器的外表跟普通函數(shù)一樣,大部分的函數(shù)都可以當(dāng)做構(gòu)造器使用。如果構(gòu)造函數(shù)顯式的返回一個(gè)對(duì)象,那么則會(huì)指向該對(duì)象。 this 的指向 this 是 js 中定義的關(guān)鍵字,它自動(dòng)定義于每一個(gè)函數(shù)域內(nèi),但是它的指向卻讓人很迷惑。在實(shí)際應(yīng)用中,this 的指向大致可以分為以下四種情況。 1.作為普通函數(shù)調(diào)...
摘要:再來看一個(gè)小的示例淘寶騰訊淘寶為什么輸出的依然是淘寶呢調(diào)用的是對(duì)象中的方法,方法里面有一個(gè)定時(shí)器,而定時(shí)器的一個(gè)參數(shù)是這里的指的就是的對(duì)象,然后方法里面有調(diào)用了,但是定時(shí)器中的指的是對(duì)象,所以最終調(diào)用的是對(duì)象中。 1.看前熱身 看一段代碼 var name = javascript; var obj = { name:js, foo:f...
摘要:語法參數(shù)這個(gè)對(duì)象將替代類里的對(duì)象可選在函數(shù)運(yùn)行時(shí)使用的值。如果該參數(shù)的值為或,則表示不需要傳入任何參數(shù)。更簡單的講就是將和傳入函數(shù)執(zhí)行。 學(xué)了那么久前端,對(duì)apply、call這兩個(gè)函數(shù)的用法,還不是很掌握。今天看了很多網(wǎng)上的文章,我總結(jié)和歸納下用法。 Function.prototype.apply() apply() 方法調(diào)用一個(gè)具有給定this值的函數(shù),以及作為一個(gè)數(shù)組(或類似數(shù)...
摘要:但是有一個(gè)總的原則,那就是指的是,調(diào)用函數(shù)的那個(gè)對(duì)象使用主要分四種情況,討論下指針的用法和注意事項(xiàng)一純粹的函數(shù)調(diào)用這是函數(shù)的最通常用法,屬于全局性調(diào)用,因此就代表全局對(duì)象。 this是Javascript語言的一個(gè)關(guān)鍵字它代表函數(shù)運(yùn)行時(shí),自動(dòng)生成的一個(gè)內(nèi)部對(duì)象,只能在函數(shù)內(nèi)部使用,隨著函數(shù)使用場合的不同,this的值會(huì)發(fā)生變化。但是有一個(gè)總的原則,那就是this指的是,調(diào)用函數(shù)的那個(gè)對(duì)...
摘要:但是有一個(gè)總的原則,那就是指的是,調(diào)用函數(shù)的那個(gè)對(duì)象使用主要分四種情況,討論下指針的用法和注意事項(xiàng)一純粹的函數(shù)調(diào)用這是函數(shù)的最通常用法,屬于全局性調(diào)用,因此就代表全局對(duì)象。 this是Javascript語言的一個(gè)關(guān)鍵字它代表函數(shù)運(yùn)行時(shí),自動(dòng)生成的一個(gè)內(nèi)部對(duì)象,只能在函數(shù)內(nèi)部使用,隨著函數(shù)使用場合的不同,this的值會(huì)發(fā)生變化。但是有一個(gè)總的原則,那就是this指的是,調(diào)用函數(shù)的那個(gè)對(duì)...
閱讀 2519·2021-09-09 09:33
閱讀 2879·2019-08-30 15:56
閱讀 3164·2019-08-30 14:21
閱讀 915·2019-08-30 13:01
閱讀 880·2019-08-26 18:27
閱讀 3598·2019-08-26 13:47
閱讀 3468·2019-08-26 10:26
閱讀 1600·2019-08-23 18:38