搜尋

首頁  >  問答  >  主體

javascript中關於方法的呼叫的疑問

雷雷
我想大声告诉你我想大声告诉你2862 天前660

全部回覆(5)我來回復

  • PHP中文网

    PHP中文网2017-05-19 10:36:27

    其實這段程式碼對函數的呼叫並不是這句

    takeNoteButton.onclick = createNote;

    留意一下日常寫的程式碼,我們對函數的呼叫不都是 xxxxx(),xxx.xxx()或xxx.call()等類似這樣的形式嗎?
    而這句程式碼你可以理解為一個賦值語句,takeNoteButton 的 onclick 屬性賦值為 createNote 這個函數名,實際引用指向下面宣告的具體函數。

    這樣,瀏覽器在監聽到takeNoteButton的點擊事件發生的時候,你可以想像成,實際上就進行了takeNoteButton.onclick(event)這樣的函數呼叫。

    下面說下參數,函數調用傳入的實參和函數聲明的形參實際上是分開的,並不需要對應起來,並且聲明時指定的參數不一定要傳入(會作為undefined處理),調用時實際傳入的參數,如果在宣告的函數體內並沒有用到,那也完全沒有問題。

    例如這個事件點擊時調用的函數,它是由瀏覽器底層自己進行調用,並傳入了事件物件作為實參。那麼反推過來,我們在寫具體的函數體的時候,可以用一個event也好,e也好,abc也好,隨便一個符合規範的名字作為形參來取得實際傳入的實參,當然也可以不用形參,用arguments這個類別數組物件也能存取到實際傳入的參數,例如:

    var a = 1;
    fn(a);
    // 可以这样拿到a
    function fn(param) {
        console.log(param);
    }
    // 也可以这样拿到a
    function fn() {
        console.log(arguments[0]);
    }

    其實這也為我們寫一些元件插件提供了參數設計的思路,在元件內部的函數呼叫上我們可以指定傳入的實參,而這個實參具體的值可以設計為一個暴露出去的參數讓外部傳入,舉個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()調用,輸出預設的default a
    也可以用過$().plugin({a : '123'}) 這樣傳入指定的參數,輸出123
    而我們實際寫的函數,形參還是a,實際呼叫函數傳入的參數還是options.a,並且做了外部不傳入參數的預設值的處理。

    回覆
    0
  • 大家讲道理

    大家讲道理2017-05-19 10:36:27

    js中函數的呼叫跟行參個數沒有關係,js的函數參數是一個arguments的類別數組,就是如果你傳入一個參數,對應的就是arguments[0],兩個參數的話就是argument[0]和argument[1]。所以行參合實參的個數不一定要完全吻合的,函數底層會根據你傳入的參數個數來匹配的。

    回覆
    0
  • 習慣沉默

    習慣沉默2017-05-19 10:36:27

    當然是可以的了,你可以理解onclick是個指針,指向createNote這個function,並不是真正呼叫它。呼叫這個onclick方法是瀏覽器來完成的,瀏覽器會傳入e這個參數。

    可以理解下面的程式碼:

    var obj = {
        onclick: null
    };
    
    function test(msg) {
        console.log(msg);
    }
    
    obj.onclick = test;

    // 当点击事件发生以后
    if (obj.onclick && typeof obj.onclick === 'function') {
        obj.onclick("这是我传进去的参数,相当于e");
    }

    回覆
    0
  • 世界只因有你

    世界只因有你2017-05-19 10:36:27

    在js中,形參和實參不一定要一一對應,事件監聽函數就相當於一個回呼函數。

    當事件發生時,瀏覽器就會呼叫這個函數並把事件物件傳進去。

    回覆
    0
  • 世界只因有你

    世界只因有你2017-05-19 10:36:27

    我覺得這個問題有些缺陷 因為你問函數可以呼叫嗎 ?當然可以呼叫因為這個函數屬於window下一個變數 其實函數也是變數!只是比較特殊 形參有但不一定非要有實參 如果你傳入的實參比較特殊或在在另外一個作用域下你要先獲得實參才能傳遞 否則你用這個參數的時候回報錯

    回覆
    0
  • 取消回覆