Ich lerne funktionale Programmierung und node.js, und ich stieß auf dieses seltsame Problem bei der Verwendung von Function.prototype.apply
und .bind
. Sind Funktionsargumente nicht unbedingt Objekte?
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
Dieser Code funktioniert, es Spione erfolgreich auf target.method
.
//same code here
target[method] = function (args){//args specified
obj.count++
original.apply(this, args)//and passed here
}
//same code here
Dieser Code funktioniert jedoch nicht. Es gibt eine Fehlermeldung: TypeError: CreateListFromArrayLike called on non-object
.
Und dann ist die größte Überraschung, diese Methode funktioniert einwandfrei.
//same code here
target[method] = function (args){
obj.count++
original.bind(this, args)
}
//same code here
Also warum genau bekomme ich diesen Fehler? Liegt es daran, dass Funktionsargumente nicht notwendigerweise Objekte sind? Oder ist es, weil anwenden eine strengere Beschreibung als binden?
Nun ja, ['apply'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply) und [' bind'] (https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind) haben sehr unterschiedliche Beschreibungen. 'apply' nimmt als zweiten Parameter ein Array oder ein [' arguments' Objekt] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments) - wenn Sie nicht ' t an einem vorbei, klagt es. – Bergi
Sehr unklar. Erstens, das funktioniert/funktioniert nicht Code-Fragmente sind identisch (es sei denn, ich vermisse etwas). Zweitens ruft 'bind' die Funktion nicht auf, daher ist es schwer zu glauben, dass" funktioniert ". – Amit
@Amit tut mir leid, ich werde bearbeiten, damit es mehr offensichtlich ist. –