2

arguments.calleeについては多くの誤りがあり、実行可能なES5 の厳格なモードの代替手段に実際に置き換えることができないユースケースが存在するかどうかを理解しようとしています。

MDN の arguments.calleeドキュメントでは、arguments.callee の使用を指摘していますが、以下のコード例では適切な代替手段はありません。

function createPerson (sIdentity) {
    var oPerson = new Function("alert(arguments.callee.identity);");
    oPerson.identity = sIdentity;
    return oPerson;
}

var john = createPerson("John Smith");

john();

彼らはバグを包括的にリンクして、argument.calleeをES5 strict modeに準拠したコードに置き換えることができない場合があることを示しました。

ただし、例として使用したコードは、次の厳格モードの代替手段に置き換えることができます。

"use strict";

function createPerson(sIdentity) {
    var oPerson = function () {
        alert(oPerson.identity);
    };

    oPerson.identity = sIdentity;
    return oPerson;
}

var john = createPerson("John Smith");

john();

それを指摘して、arguments.calleeを置き換えることができないいくつかのアルゴリズムが実際に存在しますか?

バウンティ

arguments.callee報奨金を獲得するために、別のソリューションを使用することがはるかに不明瞭または不可能になる場所の使用法を回答に含めたいと思います。

MDN の例では、代替として私が書いたバージョンは、そのコードの使用法を変更しません。

4

3 に答える 3

2

使用例を次に示します。グローバル名前空間または DOM を汚染したり、他の名前の衝突の危険を冒したりせずに、インライン化されたイベント ハンドラー (生成された/テンプレート化されたコードに由来する可能性がある) の変数を保持します。

<button onclick="var f=arguments.callee;alert(f.i=(f.i||0)+1)">CLICK</button>

デモンストレーション

さて、それは合法的な使用ではないとしましょう。もちろん、本当に合法的なものやarguments.callee、廃止されなかったものはありません。

于 2014-05-26T16:46:51.690 に答える
0

関数を (文字列から)動的に作成する場合、通常のクロージャのように外部変数を「キャプチャ」することはできません。

そのため、MDN の例では、 を介して値にアクセスできるようにすることで、クロージャをシミュレートしていますarguments.callee。関数のシグネチャを変更しない限り、他に方法はありません。

于 2014-05-23T16:02:35.213 に答える
0

例を誤解していると思います。Functionコンストラクターを使用することを意味しますargument.calleeに代わるものはありませんつまり、以下のコード

function createPerson (sIdentity) {
    var oPerson = new Function("alert(oPerson.identity);");
    oPerson.identity = sIdentity;
    return oPerson;
}

var john = createPerson("John Smith");

john();

間違っている

于 2014-05-26T16:30:25.093 に答える