6 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
document.getElementById("myBtn").onclick = displayDate;
在上面的行中,您通過將函數(shù)名稱分配給屬性onclick來將“myBtn”的點(diǎn)擊事件訂閱到displayDate函數(shù)
document.getElementById("myBtn").onclick = displayDate();
在這種情況下,您將調(diào)用displayDate函數(shù)并將displayDate函數(shù)的返回值分配給onlclick屬性。
這里的displayDate函數(shù)沒有返回任何東西。所以undefined被分配給onclick屬性。
當(dāng) javascript 運(yùn)行時(shí)執(zhí)行此行時(shí),displayDate函數(shù)在評(píng)估賦值操作時(shí)執(zhí)行,并且由于未定義被賦值給onclick,所以當(dāng)進(jìn)一步單擊按鈕時(shí),不會(huì)發(fā)生任何事情。

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊
作為初學(xué)者,要全神貫注有點(diǎn)困難。如果您熟悉其他語言的引用,例如C,您實(shí)際上是將指向函數(shù)的指針傳遞給處理程序onClick。
根據(jù)MDN 定義:
functionRef是函數(shù)名或函數(shù)表達(dá)式。該函數(shù)接收一個(gè)MouseEvent對(duì)象作為其唯一參數(shù)。在函數(shù)中,這將是觸發(fā)事件的元素。
用易于理解的術(shù)語來說,發(fā)生的事情是傳遞一個(gè)函數(shù)引用,該函數(shù)引用由onclickEventHandler 在事件上觸發(fā),并嘗試將其傳遞給DOM onevent 處理程序event中的任何內(nèi)容(在這種情況下,我們應(yīng)該將事件作為參數(shù)傳遞給函數(shù)引用)onclick
如果我們要偽聲明處理程序onclick,它看起來像這樣:
// this is very simplified, but serves as illustration
const onclick = (event: MouseEvent<HTMLELement>) => {
yourFunctionReference(event)
}
因此,每次觸發(fā)事件時(shí),DOM onevent 處理程序都會(huì)將事件傳遞給函數(shù)引用并調(diào)用函數(shù)。
如果您改為調(diào)用處理程序中的函數(shù)onclick,它只會(huì)將返回值傳遞給它,這通常不是您想要的,例如。
const returnHi = () => 'hi'
document.getElementById("myBtn").onclick = returnHi();
基本上會(huì)導(dǎo)致
const onclick = (event) => {
'hi'
}
然而,當(dāng)您想要將其他參數(shù)傳遞給事件處理程序時(shí),此行為很有用,請(qǐng)考慮以下示例。
<button name="myBtn" id="myBtn">Try it</button>
<p id="demo"></p>
<script>
const eventCallbackLog = (event, message) => {
const { name } = event.target
console.log(`${name} ${message}`)
}
document.getElementById("myBtn")
.onclick = event => eventCallbackLog(event, 'says hi');
</script>

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊
如果我正確理解你的問題,
// CASE 1
document.getElementById("myBtn").onclick = displayDate;
相當(dāng)于
// CASE 2
document.getElementById("myBtn").onclick = function() {
displayDate();
};
在這里,您將一個(gè)函數(shù)分配給 onclick,它將在單擊時(shí)執(zhí)行。
在 CASE 1 中,displayDate保存分配給 onclick 的函數(shù)。所以當(dāng)你點(diǎn)擊時(shí)它會(huì)被執(zhí)行
但是當(dāng)你這樣做的時(shí)候
// notice () after displayDate
document.getElementById("myBtn").onclick = displayDate();
這里先執(zhí)行displayDate,返回值賦值給onclick。這就是為什么您甚至在單擊“嘗試”之前就看到日期的原因

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超5個(gè)贊
您在此處分配函數(shù)引用,在行下方
document.getElementById("myBtn").onclick = displayDate; // function reference
下面一行會(huì)將函數(shù)的返回值賦給 the ,onclick除非你function從displayDate()
document.getElementById("myBtn").onclick = displayDate(); // Assignins return value
現(xiàn)在當(dāng)你返回一個(gè)函數(shù)時(shí),它會(huì)起作用
function displayDate() {
return function() {
document.getElementById("demo").innerHTML = Date();
}
}
document.getElementById("myBtn").onclick = displayDate();
<p>Click "Try it" to execute the displayDate() function.</p>
<button id="myBtn">Try it</button>
<p id="demo"></p>

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
在這種情況下分配完成
document.getElementById("myBtn").onclick = displayDate;
但在這種情況下,該函數(shù)被調(diào)用
document.getElementById("myBtn").onclick = displayDate();

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊
它的概念是callback:
document.getElementById("myBtn").onclick = displayDate;
將命名函數(shù)分配displayDate給回調(diào)onClick。這意味著在某些時(shí)候代碼將調(diào)用onclick,因此執(zhí)行您的函數(shù)。它的工作方式與此類似:
function test(){alert("i'm executed!")}
function executeThis(func){
setTimeout(function(){
func() // <-- here the function is called!
}, 2000);
}
executeThis(test); // <-- here the function is passed for reference
另一方面,以這種方式傳遞回調(diào):
document.getElementById("myBtn").onclick = displayDate();
將傳遞給回調(diào)的結(jié)果displayDate
例如:
function test(){
console.log("i'm executed!");
return function(){
alert("i'm the return value");
}
}
function executeThis(func){
setTimeout(function(){
func() // <-- here the function RESULT is called!
}, 2000);
}
executeThis(test()); // <-- here the function is executed and its result is passed
添加回答
舉報(bào)