2009-08-03 16 views
3

呼び出す関数のスコープ内にある変数にアクセスできる関数を定義しようとしています。呼び出しスコープからjavacript変数にアクセスする

( "a" + bよりもきれいで、String.format( "a {0}"、b)よりも簡潔な文字列フォーマッタを構築しようとしています。 B} ")、それが可能である場合、私は知らない)

ので

 
function magic(str) { 
    return parentScope[str]; // or return eval(str); 
    // or something like that 
} 

function call() { 
    var a = 1; 
    alert(magic("a")); 
} 
call(); 

警告する "" 1。

現在、私はこれを行うには関数戻りコードをevalする必要がありますが、より良い方法が必要であるようです。

+0

を、私は「arguments.callee.callerは」親で取得すると思いますが、実装はブラウザ - ですより依存しています。 arguments.calleeでも廃止される可能性があると私は思います。すべてのことから離れていることをお勧めします。 – Nosredna

答えて

2

ただ、コール機能にあなたの「魔法」の機能を置く:舞台裏

function call() { 
    function magic(str) { 
     return a; 
    } 

    var a = 1; 
    alert(magic()); 
} 
call(); 

このメカニズムは非常に強力な概念です閉鎖と呼ばれます。コールバック関数が依然として呼び出し関数のローカル変数にアクセスできるAJAX要求を考えてみてください。

UPDATE

私はあなたの質問を誤解。実際にビルドしたいことは、呼び出し側のスコープにアクセスすることができないため、JavaScriptで実装することは不可能です。

UPDATE 2

はここで機能を書式設定私の文字列です。あなたが望むかもしれないほど簡潔ではありませんが、依然として非常に有用です。

"%-% %".arg(1,2).arg(3) 

をし、私は手を差し伸べるとJavaScriptで関数から任意の変数をつかむことは不可能である知っている限り

"1-2 3" 
+0

私は、このことが文脈の中で与えられているとは考えていません。彼は書式設定に基づいて文字列から任意の変数名を取り出すことを考えています。 – annakata

0

を受け取る:

String.prototype.arg = function() 
{ 
    result = this; 

    // This depends on mootools, a normal for loop would do the job, too 
    $A(arguments).each((function(arg) 
    { 
     result = result.replace("%", arg); 
    }).bind(this)); 

    return result; 
} 

あなたはそれが好きで使用することができます。実行中のメソッドからではなく、オブジェクトからのものです。

私はここであなたを助ける関数メソッド(適用、呼び出し、その他)を考えることはできません:率直に言って、あなたは通常のstring.format、 。

0

@sebasgoは正しいです、あなたがしようとしていることを正確に行うことはできません。しかし、私はあなたがプロトタイプのString.interpolate方法見たいかもしれないと思った:「はarguments.caller」がありました

"#{animals} on a #{transport}".interpolate({ animals: "Pigs", transport: "Surfboard" }); 
//-> "Pigs on a Surfboard" 

var syntax = /(^|.|\r|\n)(\<%=\s*(\w+)\s*%\>)/; //matches symbols like '<%= field %>' 
var html = '<div>Name: <b><%= name %></b>, Age: <b><%=age%></b></div>'; 
html.interpolate({ name: 'John Smith', age: 26 }, syntax); 
// -> <div>Name: <b>John Smith</b>, Age: <b>26</b></div> 
関連する問題