其實這段代碼對函數(shù)的調(diào)用并不是這句
takeNoteButton.onclick = createNote;
留意一下日常寫的代碼,我們對函數(shù)的調(diào)用不都是 xxxxx(),xxx.xxx()或者xxx.call()等類似這樣的形式嗎?
而這句代碼你可以理解為一個賦值語句,takeNoteButton 的 onclick 屬性賦值為 createNote 這個函數(shù)名,實際引用指向下面聲明的具體函數(shù)。
這樣,瀏覽器在監(jiān)聽到takeNoteButton的點擊事件發(fā)生的時候,你可以想象成,實際上就進行了takeNoteButton.onclick(event)這樣的函數(shù)調(diào)用。
下面說下參數(shù),函數(shù)調(diào)用傳入的實參和函數(shù)聲明的形參實際上是分開的,并不需要對應起來,并且聲明時指定的參數(shù)不一定要傳入(會作為undefined處理),調(diào)用時實際傳入的參數(shù),如果在聲明的函數(shù)體內(nèi)并沒有用到,那也完全沒有問題。
比如這個事件點擊時調(diào)用的函數(shù),它是由瀏覽器底層自己進行調(diào)用,并傳入了事件對象作為實參。那么反推過來,我們在寫具體的函數(shù)體的時候,可以用一個event也好,e也好,abc也好,隨便一個符合規(guī)范的名字作為形參來取得實際傳入的實參,當然也可以不用形參,用arguments這個類數(shù)組對象也能訪問到實際傳入的參數(shù),比如:
var a = 1;
fn(a);
// 可以這樣拿到a
function fn(param) {
console.log(param);
}
// 也可以這樣拿到a
function fn() {
console.log(arguments[0]);
}
其實這也為我們寫一些組件插件提供了參數(shù)設(shè)計的思路,在組件內(nèi)部的函數(shù)調(diào)用上我們可以指定傳入的實參,而這個實參具體的值可以設(shè)計為一個暴露出去的參數(shù)讓外部傳入,舉個jQuery的簡單栗子:
$.fn.plugin = function(option) {
var defaultOp = {
a : 'default a'
};
var options = $.extend(defaultOp, option || {});
var fn = function(a){ console.log(a) };
fn(options.a);
}
這段代碼可以通過$().plugin()調(diào)用,輸出默認的default a
也可以用過$().plugin({a : '123'}) 這樣傳入指定的參數(shù),輸出123
而我們實際寫的函數(shù),形參還是a,實際調(diào)用函數(shù)傳入的參數(shù)還是options.a,并且做了外部不傳入?yún)?shù)的默認值的處理。
js中函數(shù)的調(diào)用跟行參個數(shù)沒有關(guān)系,js的函數(shù)參數(shù)是一個arguments的類數(shù)組,就是如果你傳入一個參數(shù),對應的就是arguments[0],兩個參數(shù)的話就是argument[0]和argument[1]。所以行參合實參的個數(shù)不一定要完全吻合的,函數(shù)底層會根據(jù)你傳入的參數(shù)個數(shù)來匹配的。
當然是可以的了,你可以理解onclick是個指針,指向createNote這個function,并不是真正調(diào)用它。調(diào)用這個onclick方法是瀏覽器來完成的,瀏覽器會傳入e這個參數(shù)。
可以理解下面的代碼:
var obj = {
onclick: null
};
function test(msg) {
console.log(msg);
}
obj.onclick = test;
// 當點擊事件發(fā)生以后
if (obj.onclick && typeof obj.onclick === 'function') {
obj.onclick("這是我傳進去的參數(shù),相當于e");
}
在js中,形參和實參不一定要一一對應,事件監(jiān)聽函數(shù)就相當于一個回調(diào)函數(shù)。
當事件發(fā)生時,瀏覽器就會調(diào)用這個函數(shù)并把事件對象傳進去。
我覺得這個問題有些缺陷 因為你問函數(shù)可以調(diào)用嗎 ?當然可以調(diào)用因為這個函數(shù)屬于window下一個變量 其實函數(shù)也是變量!只是比較特殊 形參有但不一定非要有實參 如果你傳入的實參比較特殊或者在在另外一個作用域下你要先獲得實參才能傳遞 否則你用這個參數(shù)的時候回報錯