2011-02-08 22 views
0

私は私の質問があり、このJavascriptの範囲

$(function(){ 

    var someVariable; 

    function doSomething(){ 
     //here 
    } 

    $('#something').click(function(){ 
     //here 
    }) 

}); 

に類似した構造を持つスクリプトを持っています。

doSomething関数とクリックハンドラから
someVariableに渡すことなくどのようにアクセスできますか?

答えて

0

特別な構文なしで使用できます。 someVariableは、閉鎖範囲がdoSomethingで利用可能です。 ECMA-/Javascriptメソッドが呼び出される

Read more on JavaScript closures

+0

奇妙な、何らかの理由でこれまでに働いていなかった:/余分なリソースへのリンクのためにasapを受け入れる – Hailwood

+0

質問のコードでは、doSomethingはクロージャを作成するために使用されませんが、ハンドラはです。 – RightSaidFred

+1

クロージャが混乱する可能性があります。私はこれを理解するのがより直感的だと思う "レキシカルスコープ"とも呼ばれています。どの範囲にあるのかは純粋に判断できますが、ソースを見て、あなたのコードを囲むものを見ることができます。 – jpsimons

2

そのまま使用してください。 thisの必要はありません。

$(function(){ 
    var someVariable = 3; 
    function doSomething(){ 
     alert(someVariable); 
    } 
}); 
+0

内部関数は、自動的に外部スコープで定義された変数にアクセスできます。 –

0

(と呼ばれる)、いくつかのことが起こります。長い話をするには、と呼ばれる関数が呼び出されたときに、その関数に対してアクティブ化オブジェクトが作成されます。そのオブジェクトには、引数,ローカル変数と関数宣言引数オブジェクトがあります。呼び出された関数の「コンテキスト」には[[Scope]]プロパティがあります。これは、関数が呼び出されたときにすべて親コンテキストのが格納される場所です。

このコンセプト(私はここでかなり収縮しました)は、クロージャを持つ基本的なものです。つまり、例でdoSomething()を呼び出すと、この関数は親コンテキストを[[Scope]]にコピーします。これにはsomeVariableが含まれます。イベントリスナーの無名関数は同じことを行い、両方のメソッドが同じスコープを共有します。


短い答え:あなたはすべての方法で使用してアクセスすることができますsomeVariable