1

プライベート変数を既存の関数に入れようとしています。例:

var AObject={
 get:function(s){
        return s.toLowerCase()+a;
    }    
}

function temp(){
    var a="A";
    var o={};
    eval("o.get="+AObject.get.toString());
    reurn o;
}

var bObject=temp();
BObject.get("B");    // "bA"
BObject.get();  /* error: s is undefined; but marked in line "return o;"
                    and not in "return s.toLowerCase()+a;"*/

私の目標は、既存の AObject が所有する get() 関数を private var で実行することです ... eval(または new Function) を使用して取得しますが、残念ながらデバッガーが壊れます!

では、eval を使用せずにこれを達成する方法、または eval を使用してデバッガーを便利に保つ方法はありますか?

4

6 に答える 6

1

デバッガーが関数内の行を指さない理由は、呼び出している関数が(JavaScriptに関する限り)AObject.get関数にまったく関連していないためです。Evalには、関数を定義する文字列がどこから来たのかを知る方法がありません。関数が定義されている場所であるため、デバッガーはevalを呼び出す行を指している必要がありますが、明らかに行がずれています。

tempあなたの質問に答えるために、関数定義を内部に移動して「a」を閉じるか、「a」パラメータを追加できない限り、eval(またはFunction、おそらく望ましい)を回避する方法はないと思います。get働き。

于 2009-09-28T16:57:07.183 に答える
0
function objectbuilder(a){
  return {
    get:function(s){
      return s.toLowerCase() + a;
    }
  };
}

function temp(){
  return objectBuilder("A");
}

var bObject=temp();
BObject.get("B");    // "bA"
BObject.get();
于 2009-09-28T17:10:52.343 に答える
0

evalローカル変数aをクローン関数内で使用できるようにする場合は、 an を使用することが唯一のオプションだと思います。また、別のデバッガーを試してみます (Firefox の Firebug?)

于 2009-09-28T16:04:53.270 に答える
0

このようなことをしようとしていますか?

var AObject={
 get:function(s){
        return s.toLowerCase()+this.a;
    }    
}

function temp(){

    return {get:function(s){return AObject.get.call({a:"A"},s);}};

}

編集:彼のコメントの後;

あなたがすることはかなり間違っています.evalがスコープチェーンを変更するためだけに機能します.基本的にあなたはこれをやっています:

function temp(obj){
    var a="A";
    var o={};

    o.get=function(s){
            return s.toLowerCase()+a;
    }

    return o;
}

a はクロージャー内にあるため、これは機能しますが、真の obj get 関数を呼び出すのではなく、temp 内で機能する別の関数を作成しています。

ただし、コメントで述べているように、宣言されていない変数を含む関数を記述しないでください。代わりに、svinto のように、関数でこの変数を渡す必要があります。

編集:間違ったコードを削除しました。

于 2009-09-29T08:59:00.577 に答える
0

@ケンタロミウラ

いいえ、あなたの方法は、ウィンドウスコープに変数を入れたためにのみ機能します(グローバル...)

「this」キーは「window」オブジェクトなので、そうすると

this.a="A"

のようです

window["a"]="A"

このようにしてグローバル変数になります

function temp(obj){
    var a="A";

    return (function(){
        this.a =a;
        var o={};    
        o.get=function(s){return obj.get.call(this,s)};    
        return o;
    })();

}

var myObject=temp({
    get:function(s){
        return s.toLowerCase()+a;
    }
});

alert(myObject.get("B"));   //bA
alert(a); //A

これは回避策ではありません。グローバルではなく、プライベートにする必要があります。グローバル変数を使用することにした場合は、プライベート変数を格納できるグローバル ベクトルの使用を開始します。ありがとうございました。

于 2009-09-29T17:00:28.637 に答える
0

@svinto

function temp(obj){
    var a="A";
    var o={};
    eval("o.get="+obj.get.toString());
    reurn o;
}

var myObj=temp({
    get:function(s){
        return s.toLowerCase()+a;
    }
});

myObject.get("B");   //bA

もうわかりますか?

于 2009-09-29T08:23:58.730 に答える