Ich sah vor kurzem in den Code von firebugs console.log
von console.log.toString()
Aufruf und bekam diese:Function.apply vs. Function.prototype.apply
function() { return Function.apply.call(x.log, x, arguments); }
Solange ich verstehe dies bewirkt, dass Function.apply
mit seiner this
aufgerufen werden bezogen auf x.log
und die Argumente sind x
und arguments
. Da Function.apply
selbst Funktionen aufruft, führt dies dazu, dass x.log
mit seinen this
bezogen auf x
und arguments
als Argumente aufgerufen werden.
Das führt mich zu meiner Frage: Gibt es einen Grund, Function.apply
auf diese Weise statt nur Function.prototype.apply
anrufen? Oder mit anderen Worten, gibt es einen Unterschied zwischen den obigen und return x.log.apply(x, arguments)
?
Edit: Da es Open Source ist ich an der Firebug Quelltext einen kurzen Blick nahm und fand den Ort, an dem diese erstellt wird (consoleInjector.js, Zeile 73):
// Construct a script string that defines a function. This function returns
// an object that wraps every 'console' method. This function will be evaluated
// in a window content sandbox and return a wrapper for the 'console' object.
// Note that this wrapper appends an additional frame that shouldn't be displayed
// to the user.
var expr = "(function(x) { return {\n";
for (var p in console)
{
var func = console[p];
if (typeof(func) == "function")
{
expr += p + ": function() { return Function.apply.call(x." + p +
", x, arguments); },\n";
}
}
expr += "};})";
// Evaluate the function in the window sandbox/scope and execute. The return value
// is a wrapper for the 'console' object.
var sandbox = Cu.Sandbox(win);
var getConsoleWrapper = Cu.evalInSandbox(expr, sandbox);
win.wrappedJSObject.console = getConsoleWrapper(console);
Ich bin jetzt fast sicher, dass Das hat etwas mit Function
in einem anderen Bereich zu tun, was ich in meinem ersten Kommentar zu pst 's Antwort gesagt habe, aber ich verstehe es immer noch nicht vollständig. Ich kann ein bisschen mehr darüber nachforschen.
Ich bin neugierig, warum der Code nicht nur das Ergebnis von 'CU.evalInSandbox (" Funktion ", Sandbox)' in einem Standard-Ansatz (wie die Funktion-Objekte scheinbar zurückgegeben werden), aber anscheinend dort ist ein Grund ... eigentlich macht das auch nicht viel, da 'Funktion' nicht * geschlossen sein sollte; es sei denn, es gibt mehr Magie in 'evalInSandbox' .. –