2012-12-13 16 views
0

不知道這是否是一個愚蠢的問題。我已經開始玩幾個JavaScript框架,當我看到一個函數內部沒有使用的參數時,我總是感到困惑。爲什麼在JavaScript中有必要傳遞一個參數,即使它不會在函數內部使用?

一個Backbone的例子(模式 ARG):

var Todo = Backbone.Model.extend({ 
    validate: function(attribs){ 
    if(attribs.title === undefined){ 
     return "Title can't be undefined"; 
    } 
    }, 

    initialize: function(){ 
    console.log('This model has been initialized'); 
    this.on('error', function(model, error){ 
     console.log(error); 
    }); 
    }, 
}); 

Express的例子(REQ下一個參數):

app.use(function(err, req, res, next){ 
    console.error(err.stack); 
    res.send(500, 'Something broke!'); 
}); 

所以,我想知道,那些值只是被忽略?如果你將它們排除在外,會發生什麼?爲什麼他們必須被列入首位? (我習慣這樣的想法,如果一個函數傳遞參數是因爲它將在函數中使用)。

+2

真的,你不*必須*;如果要訪問回調或其他調用方要傳遞給該接收函數的內容(如調用函數內部有關模型狀態的信息,可能會提供請求信息回調或「e」或事件,信息給處理函數),你(通常)在函數中提供一個標籤*給相應的參數以在函數中訪問它。否則,你只是無法訪問它('''也許,但這是一個特殊的使用情況)。 –

+0

我認爲,從技術上講,這是一種依賴注入的形式,即DI。 –

回答

2

的情況下初始化

可變模型不使用,但誤差是。因爲錯誤是第二個參數,所以模型必須作爲佔位符傳遞。

同樣的事情在使用是真實的:

變量REQ不使用,但它需要一個佔位符,所以資源可以使用。


爲什麼函數的參數看起來並沒有被使用?

也許是爲了向後兼容或爲了可擴展性。

我認爲這些都是開源庫(我從來沒有用過)。

1

如果忽略這些值,則不會發生任何情況,並且它也可以很好地工作。 無論這些值是否被忽略,您是否使用它們,都會被實際傳入。

1

你不必,除非你使用的參數後面的參數,你不使用。 即使這樣,你可以在函數中使用參數對象來獲取正確索引處的參數。

function myFunc(){ 
console.log(arguments); 
} 

myFunc(1,2,3,4,5,6); // logs 1,2,3,4,5,6 

在一個文檔,不過,最好是讓developper知道在回調注入什麼樣的參數,因此developper可以繼續配置一個明確的說法。

1

你是對的,如果你不使用它們,這些參數將被忽略。此外,他們可以安全地被排除在外。但是,如果您只想訪問第二個參數,則需要將第一個參數作爲佔位符。

至於爲什麼這些論據在那裏?理解你傳遞的是一個回調函數是很重要的。這個回調函數稍後會被你傳入的函數調用。所以這是框架提供的功能,它調用你的回調函數並傳入這些參數。框架無法知道你的具體用例是什麼,並且知道你的回調需要什麼數據的確切方法。因此,框架的作者通過一些有足夠數據的論據來儘可能多地涵蓋用例。雖然你的回調函數沒有使用這些參數,但使用這些框架的其他開發人員可能正在編寫一個回調函數。

相關問題