Я изучаю функциональное программирование и node.js, и я столкнулся с этой странной проблемой при использовании Function.prototype.apply
и .bind
.Функциональные аргументы не обязательно являются объектами?
function Spy(target, method) {
var obj = {count: 0};
var original = target[method]
target[method] = function(){//no specified arguments
obj.count++
original.apply(this, arguments)//only arguments property passed
}
return obj;
}
module.exports = Spy
Этот код работает, успешно шпионит target.method
.
//same code here
target[method] = function (args){//args specified
obj.count++
original.apply(this, args)//and passed here
}
//same code here
Этот код, однако, не делает. Он выдает сообщение об ошибке: TypeError: CreateListFromArrayLike called on non-object
.
И вот самый большой сюрприз, этот метод работает отлично.
//same code here
target[method] = function (args){
obj.count++
original.bind(this, args)
}
//same code here
Почему именно эта ошибка возникает? Это потому, что аргументы функции не обязательно являются объектами? Или это потому, что apply имеет более строгие описания, чем bind?
Ну, да, ['apply'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply) и [' bind'] (https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind) имеют очень разные описания. 'apply' принимает в качестве второго параметра массив или объект' 'arguments' (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments) - если вы не наняли, т один, жалуется. – Bergi
Очень неясно. Во-первых, работы/не работают, фрагменты кода идентичны (если только я чего-то не хватает). Во-вторых, 'bind' не вызывает функцию, поэтому трудно поверить, что« работает ». – Amit
@ Извините, я собираюсь отредактировать, так что это более очевидно. –