2015-04-25 4 views
3

Чтение connect's source code, я натолкнулся на следующие строки. Я хочу знать, почему он использует Function.apply.Function.apply в исходном коде подключения

app.listen = function(){ 
    var server = http.createServer(this); 
    return server.listen.apply(server, arguments); 
}; 

Как я понимаю, Function.apply используется в тех случаях, когда вы хотите вызвать функцию с другим this значения. Поскольку server.listen в this уже указан server в приведенном выше примере, достаточно ли просто написать следующее?

app.listen = function(){ 
    var server = http.createServer(this); 
    return server.listen(arguments); 
}; 
+3

Посмотрите на второй параметр 'apply', а не на первый. –

+0

Это было бы эквивалентно, если использовать '' .call' вместо '.apply'] (http://stackoverflow.com/q/1986896/1048572) ... – Bergi

ответ

4

.apply(thisArg, argsArray) принимает два аргумента, которые вы можете увидеть описанные here. Первый аргумент (который, как вам уже известно, звучит так) - это значение this для вызова функции. Второй аргумент - это массивный объект, содержащий все аргументы, которые будут переданы функции. Этот второй аргумент заключается в том, почему он используется здесь, так что он может вызывать функцию с точно такими же аргументами, которые были переданы первой функции app.listen().

Это распространенное использование для «пересылки» всех аргументов из одной функции в другую, не зная, что на самом деле есть аргументы. Поскольку объект arguments представляет собой структуру данных, подобную массиву, он соответствует второму аргументу .apply(), который ожидает массивный объект, являющийся списком аргументов.


server.listen(arguments); не будет работать, потому что назвал бы .listen(), но будет проездом один аргумент функции, который был массив подобного списка аргументов. Это не подпись функции server.listen(). Он нуждается в каждом аргументе, переданном отдельно, а не в списке. .apply() служит для его фиксации. Он принимает массив аргументов и передает их как отдельные аргументы вызываемой функции.

server.listen(...) дополнительно осложняется тем, что он имеет четыре различных возможных набора аргументов, которые могут быть переданы ему. Использование .apply() позволяет коду пересылки быть полностью независимым от того, какие аргументы были фактически переданы, поскольку он просто направляет именно то, что было фактически передано, не имея ничего о нем знать.

Смежные вопросы