av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

javascript - 關(guān)于apply()與call()的問題

瀏覽:102日期:2023-02-23 11:40:34

問題描述

function sum(num1,num2) { return num1 + num2;}function callSum1(num1,num2) { return sum.apply(this,arguments);}function callSum2(num1,num2) { return sum.apply(this,[num1,num2]);}alert(callSum1(10,10));alert(callSum2(10,10));//call()例子就省略了

問:1.sum.apply(this,arguments)說的是對(duì)象sum調(diào)用apply方法,this指的是callSum()與sum()都是同一個(gè)作用域運(yùn)行,arguments指的就是”sum1,sum2”?2.apply()與call()的在項(xiàng)目中應(yīng)用價(jià)值是什么呢?

問題解答

回答1:

樓上寫的真復(fù)雜:)

聽我講講,題主疑惑的地方1:

function callSum1(num1,num2) { return sum.apply(this,arguments); // 這里的arguments和下面的[num1,num2]是同一個(gè)意思}function callSum2(num1,num2) { return sum.apply(this,[num1,num2]);}

arguments 是一個(gè)類似數(shù)組的對(duì)象, 對(duì)應(yīng)于傳遞給函數(shù)的參數(shù)。arguments對(duì)象是所有函數(shù)中可用的局部變量。你可以使用arguments對(duì)象在函數(shù)中引用函數(shù)的參數(shù)。

PS:this的指向在函數(shù)定義的時(shí)候是確定不了的,只有函數(shù)執(zhí)行的時(shí)候才能確定this到底指向誰,實(shí)際上this的最終指向的是那個(gè)調(diào)用它的對(duì)象

2、call和apply應(yīng)用價(jià)值(存在的意義):

作用都是為了改變函數(shù)運(yùn)行時(shí)上下文而存在的。 即改變函數(shù)體內(nèi)部this的指向'說白點(diǎn),a有xx方法,b沒有。b可以問a借!'(這tm不就是繼承嘛~)

call和apply不同點(diǎn):

接受參數(shù)方式不一樣。

如下:call接受的是連續(xù)參數(shù),apply接受的是數(shù)組參數(shù)。A.call(this, a,b,c,d)A.apply(this, [a,b,c,d])

一個(gè)傳送門:http://www.jianshu.com/p/a7b1...

回答2:

arguments是function內(nèi)置屬性之一,表示函數(shù)數(shù)組對(duì)象,即 callSum1里的arguments 指代 num1和num2https://developer.mozilla.org...

apply 跟 call的價(jià)值在于,能夠使得指定函數(shù)里面的this指向特定的對(duì)象上,舉個(gè)例子,我們用document.querySelectorAll()獲取的dom其實(shí)是一個(gè)類數(shù)組對(duì)象,非數(shù)組,如果想要用數(shù)組的方法時(shí),可以是這樣

var doms = document.querySelectorAll(’p’);[].forEach.call(doms, function(e){ //遍歷元素});

而apply 跟call主要區(qū)別在于參數(shù)格式,這個(gè)建議題主翻翻MDN。

回答3:

1.sum.apply(this,arguments)說的是對(duì)象sum調(diào)用apply方法,this指的是callSum()與sum()都是同一個(gè)作用域運(yùn)行,arguments指的就是”sum1,sum2”?

2.apply()與call()的在項(xiàng)目中應(yīng)用價(jià)值是什么呢?

針對(duì) 1 執(zhí)行結(jié)果兩個(gè)都返回 20 20

sum.apply(this,arguments) 指的是用apply來調(diào)用sum 指定sum執(zhí)行的時(shí)候的this為現(xiàn)在的這個(gè)this 后面的arguments是參數(shù)列表 是一個(gè)類數(shù)組對(duì)象,你可以簡單地當(dāng)成數(shù)組對(duì)待。

sum.apply(this,[num1, num2]) 與上面類似。

關(guān)于arguments,發(fā)一張截圖你可能就會(huì)有感性的認(rèn)識(shí)了

javascript - 關(guān)于apply()與call()的問題

以下是針對(duì)第二點(diǎn)的回答

欽點(diǎn)this

比較好理解 就是改變 this 指向 比如在 ajax 請(qǐng)求的 success 回調(diào)的時(shí)候

比如在vue開發(fā)的時(shí)候 如果沒有箭頭函數(shù) 得要用 var that = this 這樣暫存 this。 如果可以欽點(diǎn)this就沒這些問題

舉個(gè)栗子

function sayName(){ console.log(this.name); }var xiao_ming = { name: ’小明妹妹’}// 欽點(diǎn) this sayName.call(xiao_ming);

javascript - 關(guān)于apply()與call()的問題

把類數(shù)組對(duì)象轉(zhuǎn)化成真丶數(shù)組

arguments 通過類數(shù)組對(duì)象的形式 保存著函數(shù)的參數(shù)列表 。

function sumAll(){ var argu = Array.prototype.slice.call(arguments); // 從 0 開始積、每次 sum + cur 作為下次的 sum return argu.reduce((sum, cur) => sum + cur, 0); }

javascript - 關(guān)于apply()與call()的問題

其實(shí)從這里可以窺見:執(zhí)行 slice 只需要對(duì)象具備 length 正確的下標(biāo) 就可以正常執(zhí)行 并返回結(jié)果。

因?yàn)閿?shù)組的很多方法都可以用在類數(shù)組對(duì)象上,因此類數(shù)組對(duì)象很多時(shí)候確實(shí)可以被認(rèn)為就是數(shù)組。

// 聲明一個(gè)類數(shù)組對(duì)象 var a = { 0: ’hello’, 1: ’seg’, 2: ’ment’, 3: ’fault’, length: 4}// forEach Array.prototype.forEach.call(a, elem => console.log(elem)); // => 遍歷打印// reduce var helloSF = Array.prototype.reduce.call(a, (acc, cur) => acc + cur + ’ ’, ’’); console.log(helloSF); // => // 'hello seg ment fault '

javascript - 關(guān)于apply()與call()的問題

還可以做的更像數(shù)組

var a = { 0: ’hello’, 1: ’seg’, 2: ’ment’, 3: ’fault’, length: 4}a.__proto__ = Array.prototype; a.forEach(e => console.log(e)); Array.prototype.reduce.call(a, (acc, cur) => acc + cur + ’ ’, ’’);

javascript - 關(guān)于apply()與call()的問題

Object Really Like Array

實(shí)現(xiàn)偏函數(shù) Partial Function

跟數(shù)學(xué)上的偏函數(shù)類似,比如:

函數(shù) f(x, y) = x + y如果令 y = k 那么可以得到偏函數(shù) f(x, k) = x + k ( 或者這樣可能更好理解: f(x, 4) = x + 4 )

一般都是用 bind 來實(shí)現(xiàn)偏函數(shù)的。 不過 apply 和 call 和 bind 應(yīng)該集中的講講。

function logger(type){ return console.log.bind(console, type); }

javascript - 關(guān)于apply()與call()的問題

用 apply 實(shí)現(xiàn)上述 logger 就是:

function logger2(type){ return function(){var argu = Array.prototype.slice.call(arguments); argu.unshift(type); console.log.apply(console, argu); }}

javascript - 關(guān)于apply()與call()的問題

高階函數(shù)和柯里化

高階函數(shù)一般指的是返回值是函數(shù)或者其參數(shù)是函數(shù)的函數(shù)。

setTimeout 是個(gè)很好的例子 它接受一個(gè)參數(shù)(一般是函數(shù)) 然后在一定時(shí)延后執(zhí)行它。 不過傳進(jìn)去之后一般 this 就指向了 全局對(duì)象 window 如果想要?dú)J點(diǎn) this 就得用 call apply 和 bind

上面的 logger2 就做到了這點(diǎn) 返回了一個(gè)函數(shù)出去

關(guān)于柯里化 先看函數(shù) add

function add(x, y){ return a + b; }add(1, 2); // => // 3

如果參數(shù)能一個(gè)一個(gè)的傳 傳到第二個(gè)的時(shí)候就得出結(jié)果:

var add1 = add(1); add1(2); // => 3 add(3)(4); // => 7

第一次執(zhí)行返回了一個(gè)函數(shù),如果把 add 看成是數(shù)學(xué)意義上的函數(shù) 那就是 f(x, y) = x + y 我們執(zhí)行了一次 add(1) 得到 add1 其實(shí)就是令 x = 1 了,于是得到偏函數(shù)

f(1, y) = 1 + y

第二次再執(zhí)行 y 會(huì)得到實(shí)際值 算式就可以算出結(jié)果出來。

這其實(shí)是一步步消元的過程。

有什么用的?

我在函數(shù)式編程方面也才初學(xué),還沒領(lǐng)會(huì)到精髓,唯一對(duì)柯里化體會(huì)的用處是 惰性求值 剛剛的運(yùn)算在參數(shù)給齊之前不會(huì)運(yùn)行 等到參數(shù)夠了就會(huì)算出結(jié)果。

大半夜不睡覺刷sf 只能想到這些了。。。。

回答4:

手動(dòng)設(shè)置this作用域。

回答5:

百度一下你就知道。

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 玖玖色在线视频 | 国产精品日产欧美久久久久 | 最新av中文字幕 | 一级黄色片毛片 | 久久宗合色 | 毛片在线免费播放 | 欧美不卡一区二区三区 | 国产成人高清 | 亚洲欧美在线观看 | 日韩视频一区二区三区 | 日本精品久久久久久久 | 欧美精品一区二区三区在线 | 日韩精品国产精品 | 男人的天堂在线视频 | 亚洲午夜网 | 久久中文字幕一区 | 久草精品视频 | 亚洲午夜在线 | 凹凸日日摸日日碰夜夜 | 午夜精品一区二区三区在线视频 | 久久草在线视频 | 日韩av在线一区二区三区 | 欧美日韩在线一区二区三区 | 日韩精品一区二区三区久久 | 午夜影院普通用户体验区 | 男女又爽又黄视频 | 亚洲另类春色偷拍在线观看 | 91精品一区| 国产精品久久久久久久久大全 | 久草色播| 在线免费观看色 | 亚洲欧美日韩高清 | 91五月天 | 久久不卡 | 亚洲成人综合网站 | 一级全黄视频 | 亚洲国产精品一区二区www | 性天堂网| 中文字幕在线免费观看 | 免费观看一级黄色录像 | 欧美v在线|