6

console.log私は最近、呼び出してfirebugsのコードを調べたところ、console.log.toString()次のようになりました。

function () { return Function.apply.call(x.log, x, arguments); }

私が理解している限り、これによりが参照され、引数がおよびFunction.applyで呼び出されます。それ自体が関数を呼び出すため、これはその参照とその引数として呼び出されることになります。thisx.logxargumentsFunction.applyx.logthisxarguments

これが私の質問につながります:Function.applyを使用する代わりに、この方法で呼び出す理由はありますFunction.prototype.applyか? つまり、上記との間に違いはありreturn x.log.apply(x, arguments)ますか?

編集:オープンソースなので、firebugのソースコードをざっと見て、これが作成されている場所を見つけました(consoleInjector.js、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);

これは、 pstFunctionの回答に対する最初のコメントで述べたように、別の範囲にあることと関係があるとほぼ確信していますが、まだ完全には理解していません。私はそれについてもう少し研究をするかもしれません。

4

1 に答える 1

6

このことを考慮:

Function.hasOwnProperty("apply")             // false
Function.apply == Function.prototype.apply   // true
Function.__proto__ == Function.prototype     // true in FF which exposes proto

したがって、 Function の [[prototype]] はFunction.prototypeであるため、 Function.apply は機能します。この場合、両方とも希望どおりに動作するはずです。

ただし、通常の[GetProperty]ルールがまだ適用されることを考慮してください。

var f = function () {};
f.apply = "nubbits";
f.apply(/* err */);

apply確かに、 (特に互換性のない方法で)動作を変更するのは「疑わしいコード」だと思いますが、2つの形式が異なる可能性があります..個人的には、そのような仮説的な状況には対応せf.apply、コードで使用します.

于 2013-02-13T21:14:06.077 に答える