5 回答

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊
addEventListener 需要一個(gè)函數(shù)作為事件處理程序的第二個(gè)參數(shù)(回調(diào))。
第一個(gè)場(chǎng)景你傳遞給它一個(gè)命名函數(shù)引用。這就像代表函數(shù)對(duì)象的變量
如果你這樣做:
addEventListener('click', myFunc()) // with ()
然后該函數(shù)將立即被調(diào)用,并且需要返回另一個(gè)函數(shù),該函數(shù)將在事件發(fā)生時(shí)被調(diào)用。
在第二種情況下,回調(diào)函數(shù)是一個(gè)匿名函數(shù),它將在事件發(fā)生時(shí)被調(diào)用。當(dāng)它被調(diào)用時(shí),它調(diào)用內(nèi)部函數(shù)
不同之處在于第一種情況,您的命名函數(shù)將事件對(duì)象作為第一個(gè)參數(shù),而上下文this將是元素。
第二種情況的上下文this是你的類,而不是元素,如果你想訪問事件對(duì)象,你需要自己傳遞它
簡(jiǎn)單例子
document.getElementById('1').addEventListener('click', myFunc)
document.getElementById('2').addEventListener('click', (evt)=> myFunc(evt))
document.getElementById('3').addEventListener('click', ()=> myFunc())
function myFunc(event){
console.clear()
if(event){
console.log('Type of event:', event.type);
}else{
console.log('No event object')
}
if(this instanceof HTMLElement){
console.log('"this" is element:', this.tagName)
}else{
console.log('"this" is your class')
}
}
<button id="1">Named function</button>
<button id="2">Anonymous with evt</button>
<button id="3">Anonymous no evt</button>

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超4個(gè)贊
選項(xiàng)一
cartLogic() {
clearCartBtn.addEventListener('click', this.clearCart);
}
這里的第二個(gè)參數(shù)是傳遞給 的事件處理程序,它addEventListener沒有括號(hào),因?yàn)槟鳛閰?shù)傳遞的函數(shù)已經(jīng)存在于該cartLogic函數(shù)所附加的對(duì)象上。因此,當(dāng)您使用時(shí),this.clearCart您指的cartLogic是函數(shù)附加到的對(duì)象以及另一個(gè)名為clearCart.
方案二
cartLogic() {
clearCartBtn.addEventListener('click', () => {
this.clearCart();
})
}
在這里,您傳遞了一個(gè)帶有箭頭函數(shù)表達(dá)式的匿名函數(shù)定義。
根據(jù)定義,addEventListener期望作為參數(shù)
type:一個(gè)區(qū)分大小寫的字符串,表示要偵聽的事件類型。
listener指定類型的事件發(fā)生時(shí)接收通知的對(duì)象(實(shí)現(xiàn)Event接口的對(duì)象)。這必須是實(shí)現(xiàn) EventListener 接口的對(duì)象或 JavaScript 函數(shù)。有關(guān)回調(diào)本身的詳細(xì)信息,請(qǐng)參閱事件偵聽器回調(diào)。
您可以了解有關(guān)addEventListener 的所有參數(shù)的更多信息。

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超8個(gè)贊
為清楚起見,您的第二個(gè)示例應(yīng)重寫為:
cartLogic() {
clearCartBtn.addEventListener('click', () => this.clearCart());
}
現(xiàn)在,如果您從示例中刪除除差異之外的所有內(nèi)容,將很容易理解它們的不同之處。
this.clearCart
() => this.clearCart()
第一個(gè)例子是函數(shù)this.clearCart.
第二個(gè)例子是一個(gè)函數(shù),它執(zhí)行函數(shù)this.clearCart.
第二個(gè)例子涉及不必要的間接。這是唯一的區(qū)別。您不是直接傳遞this.clearCart(如第一個(gè)示例),而是傳遞一個(gè)唯一目的是執(zhí)行的不同函數(shù)this.clearCart。

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊
選項(xiàng)1. -> 這里我們不能使用括號(hào),因?yàn)樗腔卣{(diào)函數(shù)的引用,如果你在這里添加括號(hào),該函數(shù)將立即被調(diào)用。
cartLogic() {
clearCartBtn.addEventListener('click', this.clearCart);
}
選項(xiàng) 2.-> 在這里你定義了一個(gè)匿名函數(shù),所以它將作為回調(diào)函數(shù)工作,并且在這個(gè)函數(shù)中將this.clearCart();被調(diào)用。
cartLogic() {
clearCartBtn.addEventListener('click', () => {
this.clearCart();
})
}

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊
因此,為了簡(jiǎn)化您的問題,您想知道使用帶括號(hào)和不帶括號(hào)的函數(shù)有什么區(qū)別。
假設(shè)我們有一個(gè)logText()看起來像這樣的函數(shù)
function logText() {
console.log("Hello world!")
}
然后我們像這樣在控制臺(tái)中運(yùn)行
logText()
我們收到這個(gè)發(fā)回
"Hello world!"
現(xiàn)在當(dāng)我們?cè)诳刂婆_(tái)中執(zhí)行此操作時(shí)
logText
我們?nèi)』貙?duì)函數(shù)的引用,如下所示
? logText() {
console.log("Hello world!")
}
? → 功能
這有什么區(qū)別
cartLogic() {
clearCartBtn.addEventListener('click', this.clearCart);
}
和
cartLogic() {
clearCartBtn.addEventListener('click', () => {
this.clearCart()
});
}
它們之間最大的區(qū)別是第一個(gè)例子clearCart()被立即調(diào)用,而第二個(gè)例子被包裹在一個(gè)匿名函數(shù)中并且clearCart()沒有被立即調(diào)用。
這會(huì)改變事情的運(yùn)作方式嗎?
好吧,不是真的,一切仍然會(huì)以相同的方式工作,但為什么你不必在末尾添加 paratheneseclearCart因?yàn)檫@是引用函數(shù)所以我們可以想到:
cartLogic() {
clearCartBtn.addEventListener('click', this.clearCart);
}
作為
cartLogic() {
clearCartBtn.addEventListener('click', () => {
// All code for your function
...
});
}
但這對(duì)我們?cè)诤瘮?shù)(在本例中addEventListener())將一些值發(fā)送回回調(diào)時(shí)的編碼方式產(chǎn)生了影響,在這種情況下,很可能是事件 (e) 被發(fā)送回回調(diào)。
假設(shè)您clearCart()有一個(gè)名為“e”或“event”的參數(shù),如果我們使用您的第一個(gè)示例,我們不必自行處理e/event或解析事件,它將為我們解析,但是對(duì)于您的借調(diào)示例,您將不得不做這樣的事情:
cartLogic() {
clearCartBtn.addEventListener('click', e => {
this.clearCart(e)
});
}
為什么第二個(gè)例子沒有括號(hào)就不能工作?
因?yàn)榫拖裎以诨卮鸬那懊嫠f的那樣,不帶括號(hào)的函數(shù)是對(duì)函數(shù)的引用,而帶括號(hào)的函數(shù)將運(yùn)行。
當(dāng)我們不想調(diào)用函數(shù)而是想傳遞函數(shù)的引用時(shí),我們使用不帶括號(hào)的函數(shù)。
例如:
logText.length
這是解析函數(shù)對(duì)length方法的引用。
length用在函數(shù)上將返回函數(shù)期望的參數(shù)數(shù)量。
這已經(jīng)很長(zhǎng)了,所以我現(xiàn)在就在這里結(jié)束如果有什么我沒有說或沒有說好的發(fā)表評(píng)論,我會(huì)添加它:)
還看到了對(duì)其他人關(guān)于上下文的回答的評(píng)論this,我認(rèn)為這與此無關(guān),更多的是關(guān)于你如何聲明函數(shù)() => {}或function () {}.
添加回答
舉報(bào)