成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS基礎(chǔ)——call、bind、apply 和 this

asce1885 / 2241人閱讀

摘要:是在運(yùn)行時(shí)進(jìn)行綁定的,它的指向取決于它的調(diào)用位置。調(diào)用位置為當(dāng)前正在執(zhí)行的函數(shù)的前一個(gè)調(diào)用中。我們可以可以通過修改為來(lái)達(dá)到目的。返回要執(zhí)行的函數(shù),需要的時(shí)候再執(zhí)行。箭頭函數(shù)箭頭函數(shù)會(huì)繼承外層函數(shù)調(diào)用的綁定

this

首先我們分析一下下面代碼的執(zhí)行結(jié)果

function foo(num) {
     console.log( "foo: " + num );
     this.count++;  //記錄函數(shù)執(zhí)行次數(shù)
}
foo.count = 0;
function test(){
    for(let i = 0 ; i < 4; i++){
        foo(i)
    }
    console.log("foo執(zhí)行次數(shù):"+foo.count)
}
test()

執(zhí)行結(jié)果如下:

foo: 0
foo: 1
foo: 2
foo: 3
foo執(zhí)行次數(shù):0

由此可見this指向的并不是函數(shù)自身。this 是在運(yùn)行時(shí)進(jìn)行綁定的,它的指向取決于它的調(diào)用位置。我們可以通過分析調(diào)用棧來(lái)找到函數(shù)的調(diào)用位置。(調(diào)用位置為當(dāng)前正在執(zhí)行的函數(shù)的前一個(gè)調(diào)用中)。當(dāng)我們?cè)诘谝粋€(gè)例子中增加debugger,在瀏覽器工具中可以清晰的看到函數(shù)的調(diào)用棧:

foo函數(shù)的調(diào)用位置在test函數(shù)中,此時(shí)this的指向默認(rèn)綁定為window,而不是foo對(duì)象。我們可以可以通過修改this.countfoo.count來(lái)達(dá)到目的。

綁定

this的綁定規(guī)則有:默認(rèn)綁定、隱式綁定、顯式綁定、new綁定,上面函數(shù)調(diào)用中this就是默認(rèn)綁定。

new綁定
function foo(a) { 
 this.a = a;
} 
var bar = new foo(2);
console.log(bar.a);  //2
var bar2 = new foo(3);
console.log(bar2.a)   //3

當(dāng)使用new調(diào)用foo函數(shù)時(shí),會(huì)構(gòu)造一個(gè)新對(duì)象并把它綁定到 foo

顯式綁定

我們可以通過call、bind、apply來(lái)改變this的指向。call、apply本質(zhì)上沒有區(qū)別,都是立即執(zhí)行,只是第二個(gè)參數(shù)的傳值方式不一樣。bind返回要執(zhí)行的函數(shù),需要的時(shí)候再執(zhí)行。(bind后的函數(shù)當(dāng)使用new執(zhí)行時(shí),綁定無(wú)效)

function foo() { 
     console.log(this.a);
}
var obj = { 
     a:2
};
var fn = foo.bind( obj );
fn()   //2
new fn()  //undefined
隱式綁定

當(dāng)函數(shù)存在上下文對(duì)象時(shí)會(huì)影響調(diào)用位置

function foo() { 
 console.log( this.a );
}
var obj2 = { 
 a: 42,
 foo: foo 
};
var obj1 = { 
 a: 2,
 obj2: obj2 
};
obj1.obj2.foo();  //42

我們來(lái)看另一個(gè)例子

function foo() { 
 console.log( this.a );
}
function doFoo(fn) {
 // fn 其實(shí)引用的是 foo
 fn(); // <-- 調(diào)用位置!
}
var obj = { 
 a: 2,
 foo: foo 
};
var a = "oops, global"; 
doFoo( obj.foo ); 

此時(shí)fn函數(shù)會(huì)丟失上下文綁定的對(duì)象。

箭頭函數(shù)

箭頭函數(shù)會(huì)繼承外層函數(shù)調(diào)用的 this 綁定

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

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

相關(guān)文章

  • JS基礎(chǔ)篇--callapply、bind方法詳解

    摘要:首先我們可以通過給目標(biāo)函數(shù)指定作用域來(lái)簡(jiǎn)單實(shí)現(xiàn)方法保存,即調(diào)用方法的目標(biāo)函數(shù)考慮到函數(shù)柯里化的情況,我們可以構(gòu)建一個(gè)更加健壯的這次的方法可以綁定對(duì)象,也支持在綁定的時(shí)候傳參。原因是,在中,多次是無(wú)效的。而則會(huì)立即執(zhí)行函數(shù)。 bind 是返回對(duì)應(yīng)函數(shù),便于稍后調(diào)用;apply 、call 則是立即調(diào)用 。 apply、call 在 javascript 中,call 和 apply 都是...

    lastSeries 評(píng)論0 收藏0
  • 回味JS基礎(chǔ):call applybind

    摘要:使用方法調(diào)用匿名函數(shù)在下例中的循環(huán)體內(nèi),我們創(chuàng)建了一個(gè)匿名函數(shù),然后通過調(diào)用該函數(shù)的方法,將每個(gè)數(shù)組元素作為指定的值執(zhí)行了那個(gè)匿名函數(shù)。這個(gè)匿名函數(shù)的主要目的是給每個(gè)數(shù)組元素對(duì)象添加一個(gè)方法,這個(gè)方法可以打印出各元素在數(shù)組中的正確索引號(hào)。 原文:回味JS基礎(chǔ):call apply 與 bind 在JavaScript中,call、apply和bind是Function對(duì)象自帶的三個(gè)方法...

    plokmju88 評(píng)論0 收藏0
  • js基礎(chǔ)】之this,call,apply,bind

    摘要:的使用場(chǎng)景作為構(gòu)造函數(shù)執(zhí)行作為對(duì)象屬性執(zhí)行作為普通函數(shù)執(zhí)行。要在執(zhí)行時(shí)才能確認(rèn)值,定義時(shí)無(wú)法確認(rèn)改變上下文指向。 1.this this的使用場(chǎng)景: 1.作為構(gòu)造函數(shù)執(zhí)行; 2.作為對(duì)象屬性執(zhí)行; 3.作為普通函數(shù)執(zhí)行; 4.call apply bind。 this要在執(zhí)行時(shí)才能確認(rèn)值,定義時(shí)無(wú)法確認(rèn) var a = { name:A, fn:function()...

    khs1994 評(píng)論0 收藏0
  • js 面試官想了解你有多理解call,apply,bind?

    摘要:返回值這段在下方應(yīng)用中有詳細(xì)的示例解析?;卣{(diào)函數(shù)丟失的解決方案綁定回調(diào)函數(shù)的指向這是典型的應(yīng)用場(chǎng)景綁定指向,用做回調(diào)函數(shù)。 showImg(https://segmentfault.com/img/remote/1460000019971331?w=1024&h=680); 函數(shù)原型鏈中的 apply,call 和 bind 方法是 JavaScript 中相當(dāng)重要的概念,與 this...

    wuaiqiu 評(píng)論0 收藏0
  • JS系列之call & apply & bind

    摘要:參考鏈接在中,和是對(duì)象自帶的三個(gè)方法,都是為了改變函數(shù)體內(nèi)部的指向。返回值是函數(shù)方法不會(huì)立即執(zhí)行,而是返回一個(gè)改變了上下文后的函數(shù)。而原函數(shù)中的并沒有被改變,依舊指向全局對(duì)象。原因是,在中,多次是無(wú)效的。 參考鏈接:https://juejin.im/post/59bfe8... 在JavaScript中,call、apply和bind是Function對(duì)象自帶的三個(gè)方法,都是為了改變...

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

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

0條評(píng)論

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