2015-12-06 1 views
5

JavaScript関数が呼び出し元のargumentsを呼び出し元の関数の名前で参照できるメカニズムと、それがまだ言語内にある理由を教えてください。JavaScriptで呼び出し元の引数を参照できるのはなぜですか?

私はV8で末尾呼び出しの最適化(あるいは、むしろその欠如)を見上げた

とこの記事に出くわした(https://code.google.com/p/v8/issues/detail?id=457

エリック・コリーの例は、私は多分思った最初は

function foo(x) { 
    return bar(x + 1); 
} 

function bar(x) { 
    return foo.arguments[0]; 
} 

foo(1) 

以下に示します。関数を呼び出すと、argumentsフィールドが何らかの奇妙なグローバルな副作用として設定されますが、呼び出しの間だけ持続するように見えます。

function foo(x) { 
    return bar(x+1); 
} 

function bar(x) { 
    return foo.arguments[0]; 
} 

console.log(foo(1)); // prints '1' 
console.log(foo.arguments); // prints 'null' 

なぜ言語でこの動作はありますか?下位互換以外の何かのために便利ですか?

編集:私は、現在の関数本体で引数の疑似配列を参照するためにargumentsを使用してについての質問ではないのです

、例えば

function variadic() { 
    for (var i = 0; i < arguments.length; i++) { 
     console.log("%s-th item is %s", i, JSON.stringify(arguments[i])); 
    } 
} 

variadic(1, 2, 3, 4, 5, []); 

私は、呼び出し元のargumentsを参照するためにsomefunction.argumentsの使用について尋ねています。

+0

Javascriptでは、いくつの引数を指定しても、関数は任意の数の引数で呼び出すことができます。 JavaScript関数には、この機能をサポートするargumentsオブジェクトと呼ばれるビルトインオブジェクトがあります。 – Gary

+0

私の間違いは、私の例ではタイプミスがありました。 'foo.arguments'と言っているはずです。 –

+1

この動作はstrictモードではなく、関数の 'を読み込もうとしています。引数は 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode(" secure "の下に)エラーをスローする – Eevee

答えて

1

これは、エラーを捕捉して独自のコード内で計算したい場合に役立ちます。統合された出力でエンドユーザーのことを明確にしたり、デバッグしたりすることができます。あなたのコードに問題があります。このすべてはcallerargumentsのものがスタックのデバッグに役立ちます。また、ロギング(やり直し、物のデバッグ)、呼び出し元関数の名前(場合によってはその引数)も表示できます。 または、この情報を何らかの形で(おそらくオブジェクト関数内で)使用する難解なプログラムを実行できます。それが存在する理由

理由が、これは言語の一部(私はなぜが、ここで良い質問はないと思う)であるということです。

-1

あなたが呼び出される関数にarguments変数を渡すことができます。

function foo(x) { 
    return bar(x+1, arguments); 
} 

function bar(x, foo_arguments) { 
    return foo(foo_arguments[0]); 
} 

またはグローバル変数にその変数を置く:

var args = false; 

function foo(x) { 
    args = arguments; 
    return bar(x+1); 
} 

function bar(x) { 
    return foo(args[0]); 
} 

EDIT:

かのcallerプロパティを使用します関数:

function foo(x) { 
    return bar(x+1); 
} 

function bar(x) { 
    return foo(bar.caller.arguments[0]); 
} 

しかし、これはすべて私にはあまり意味がありません。達成しようとしていることを明確にすることはできますか?

+2

誰かがdownvotes場合は、少なくとも理由のコメントをすることができます。 – emi

+0

私は 'foo.arguments'がどのように有用で、なぜそれが存在するのかという実際の問題とは関係がないように思えます – Eevee

関連する問題