4

1) 次のコードがあります。

var callIt = function(fn) {
    return fn.apply(this, Array.prototype.slice.apply(arguments, 1));
};

nodejsでcallItが呼び出されると、次のように文句を言います:

    return fn.apply(this, Array.prototype.slice.apply(arguments, 1));
                                                ^
TypeError: Function.prototype.apply: Arguments list has wrong type

2) callIt を次のように変更した場合:

var callIt = function(fn) {
    return fn.apply(this, Array.prototype.slice.apply(arguments));
};

Nodejs は文句を言いませんが、余分な最初の引数が渡されたため、結果は期待したものではありません。

3) callIt を次のように変更した場合:

var callIt = function(fn) {
    var args = Array.prototype.slice.apply(arguments);
    return Function.prototype.apply(fn, args.slice(1));
    //return fn.apply(this, args.slice(1)); //same as above

};

期待どおりに動作します。

4) Chrome 開発者ツール コンソールで次のようにテストを実行すると:

> var o={0:"a", 1:"asdf"}
undefined
> o
Object
0: "a"
1: "asdf"
__proto__: Object
> Array.prototype.slice.call(o,1)
[]
> Array.prototype.slice.call(o)
[]

現在、スライスは配列のようなオブジェクトでは機能しません。

私はこれらに困惑しています。説明してください。

以下を参照しました: Array_generic_methods

4

1 に答える 1

5

あなたの問題は、apply関数のメソッドが2番目のパラメーターとして配列を期待していることです-それが TypeError の由来です1。代わりに、[1]以下のcall方法を使用してください。

fn.apply(this, Array.prototype.slice.call(arguments, 1));

これが機能しなかった理由{0:"a", 1:"asdf"}は、これが配列のようなオブジェクトではないためです。プロパティがありません。それをするでしょう。length[].slice.call({0:"a", 1:"asdf", length:2}, 0)

于 2013-02-14T08:40:37.083 に答える