2016-09-19 8 views
0

Может ли кто-нибудь объяснить мне, как это могло когда-либо работать? Я вижу функцию с одним аргументом и, кажется, бросает ошибку всякий раз, когда у нее есть аргументы «меньше или равны 3», которые всегда были бы.Функция Hapijs Glue 'compose' не должна работать, но это так. Как?

exports.compose = function (manifest /*, [options], [callback] */) { 

    Hoek.assert(arguments.length <= 3, 'Invalid number of arguments'); 

Я вижу это здесь:

https://github.com/hapijs/glue/blob/67f8331326e11fb91c1ee0c4a99ac6c0ec310f5e/lib/index.js#L38

Как это работает? Я неправильно понял?

+1

Он выдает ошибку, если '! (Arguments.length <= 3)'. –

ответ

0

В JS, объявляя

var f = function (a, b, c) { 
    console.log(a+b+c); 
}; 

эквивалентно

var f = function() { 
    var a = arguments[0]; 
    var b = arguments[1]; 
    var c = arguments[2]; 
    console.log(a+b+c); 
}; 

Это означает, что параметры, которые вы называете только «ник» для arguments[i], и что вы можете вызвать функцию с параметрами или без них : «ожидаемые» (названные) параметры будут просто undefined.

В отличие от других языков, параметры функции не являются частью ее подписи. Это делает кодирование менее строгим, так как вы можете сделать неправильный вызов, который будет выполняться без ошибки интерпретатора. Тем не менее, это когерентно со слабым характером типизации JS: функция также неадекватно набрана, поскольку их подпись - это просто их имя.

Все функции будучи де-фактоvariadic таким образом, что по своей сути позволяет принципы overloading, так как ваша функция может вести себя по-разному в зависимости от количества и характера аргументов. (PHP, который тоже набирается, тоже имеет такой же механизм.)

См. the arguments object definition, который расскажет вам больше об этой функции!