第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

求解釋,這里的arguments是同一個(gè)arguments嗎?

求解釋,這里的arguments是同一個(gè)arguments嗎?

SMILET 2022-06-16 17:11:37
if(typeof Function.prototype.bind==="undefined"){Function.prototype.bind=function(thisArg){var fn=this,slice=Array.prototype.slice,args=slice.call(arguments,1);//arguments1return function(){return fn.apply(thisArg,args.concat(slice.call(arguments)));//arguments2}};}
查看完整描述

2 回答

?
繁花如伊

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個(gè)贊

 這里確實(shí)是兩個(gè)arguments,而且這兩個(gè)arguments是不同的。

  首先你要理解prototype里bind()函數(shù)的含義,bind()函數(shù)和apply()、call()函數(shù)一樣,都是用來改變函數(shù)的上下文環(huán)境(即函數(shù)中this所指代的對(duì)象),與之不同的是,apply()和call()都是立即執(zhí)行獲取結(jié)果,而bind()可以返回一個(gè)已經(jīng)改變了上下文環(huán)境的函數(shù),供日后調(diào)用。而這個(gè)函數(shù)本身是有參數(shù)的,這里bind()函數(shù)就是可以在函數(shù)獲取上下文環(huán)境時(shí)給其傳參,同時(shí)也可以在函數(shù)調(diào)用時(shí)給其傳參,所以這里會(huì)有兩個(gè)arguments。

  舉個(gè)例子吧,比方你有一個(gè)可變基數(shù)的累加函數(shù):


var add = function() {    var sum = this.base    for (var i = 0, c; c = arguments[i++];)        sum += c    return sum}

  在這個(gè)函數(shù)中,基數(shù)值base是通過上下文環(huán)境決定的,如果基數(shù)是1,那么add(1)的結(jié)果就是2,如果基數(shù)是10,那么add(1)的結(jié)果就是11。當(dāng)然本函數(shù)的參數(shù)是可變的,當(dāng)基數(shù)為10時(shí),你也可以這么寫:add(1,2,3,4),其結(jié)果為10+1+2+3+4=20。

  那函數(shù)的上下文環(huán)境怎么決定呢?就是題主所提到的bind()函數(shù)。下面我們規(guī)定兩個(gè)上下文:


var context1 = {    base: 1} var context2 = {    base: 10}

  這樣當(dāng)你就可以通過bind創(chuàng)造一個(gè)基數(shù)為1和基數(shù)為10的累加函數(shù):


var addbase1 = add.bind(context1, 9)var addbase10 = add.bind(context2)

  什么?你問我為什么addbase1在bind的時(shí)候會(huì)有兩個(gè)參數(shù)(context1、9)?因?yàn)檫@里其實(shí)等于我在bind的同時(shí)就給addbase1這個(gè)函數(shù)開始傳參啦,這個(gè)就是題主題目中的第一個(gè)arguments。還記得那個(gè)切片arguments.slice(1)么?就是把提供上下文的參數(shù)context1切掉了,保留了傳給addbase1的參數(shù)9。

  當(dāng)然,在定義了函數(shù)之后我也可以正常傳參,如:


addbase1(1, 2, 3, 4)  //結(jié)果為20addbase10(1, 2, 3, 4) //結(jié)果也是20

  這里的1,2,3,4就是題主所謂的第二個(gè)arguments,而我們看到函數(shù)addbase1的結(jié)果和addbase10的結(jié)果一樣,就是因?yàn)樵赽ind函數(shù)里有一行concat,將我們兩次傳入的arguments結(jié)合了起來,使得addbase1的過程變成:1(基底)+9(第一次傳參)+1+2+3+4 = 20

  但是要注意的時(shí),第一次傳參的arguments和第二次傳參的arguments是不同的,因?yàn)榈谝淮蝹魅氲膮?shù)會(huì)被保存在函數(shù)的閉包中,成為一種currying的屬性,不會(huì)隨著以后的傳參而改變(即保存在了代碼第五行的args中)。也就是說,當(dāng)你再次執(zhí)行如下代碼時(shí):


addbase1(1, 2, 3, 4)  //結(jié)果依然是20,實(shí)際上addbase1和addbase10一樣了

  實(shí)際上也就是說,在bind時(shí)傳入的參數(shù),也就是第一個(gè)arguments,會(huì)影響函數(shù)的屬性;在調(diào)用時(shí)傳入的參數(shù),也就是第二個(gè)arguments,不會(huì)影響函數(shù)的性質(zhì)。

  希望能幫到你。


查看完整回答
反對(duì) 回復(fù) 2022-06-20
?
慕虎7371278

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊


Function.prototype.bind=function(thisArg){    var fn=this,        slice=Array.prototype.slice,        args=slice.call(arguments,1);//arguments1        var a1 = arguments;    return function(){        alert(a1 == arguments);// 判斷是否為同一個(gè)        return fn.apply(thisArg,args.concat(slice.call(arguments)));//arguments2    }};((function(){}).bind())(2);// 總是alert出false

不是。第一個(gè)arguments是只thisArg,第二個(gè)則是指返回的那個(gè)函數(shù)的arguments。


Function.prototype.bind=function(thisArg){    var fn=this,        slice=Array.prototype.slice,        args=slice.call(arguments,1);//arguments1    alert(arguments[0]);// alert出1    return function(){        alert(arguments[0]);// alert出2        return fn.apply(thisArg,args.concat(slice.call(arguments)));//arguments2    }};((function(){}).bind(1))(2);



查看完整回答
反對(duì) 回復(fù) 2022-06-20
  • 2 回答
  • 0 關(guān)注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)