Javascriptのすべての機能には独自の有効範囲があります。つまり、varキーワードで定義したすべての変数は、その関数内でのみ使用可能になります。これは、setFoo(10)
を呼び出すと、変数fooを作成して5の値を与え、その後、スコープから外れてすぐに破棄されることを意味します。
この問題を解決する方法は複数あります。最初に、varキーワードを削除します。これはfooをグローバルスコープに置き換えます。つまり、どこでも使用できます。しかし、これは推奨されません。グローバルスコープをできるだけ整理しておきたいので、同じページに複数の人が提供するJavaScriptコードを他の人の変数に上書きすることはできません。それを行うための別の方法は、これを次のようになります。あなたはそれがどこでも利用できるようにしたいので、
この例では
function setFoo(val){
var foo = val;
alertfoo = function(){
alert(foo)
}
}
は、あなたがグローバルスコープに入れている唯一のものは、alertfoo機能です。 alertfoo関数はsetFoo関数の中で定義されています。これは、setfooが実行された後にfooが有効範囲外になったはずであるが、alertfooがアクセスできるのでメモリに保持されることを意味します。
これはいくつか素晴らしいトリックになります。たとえば、他の人のページに含まれるjavascriptライブラリを作成していて、グローバルスコープを汚染することなく変数を定義できるスコープを作成したいとします。これを行う最も一般的な方法は、自己実行機能を宣言することです。これは、このようになり、すぐに定義された後に実行される関数である。
(function(){
//set variables you want to be global in your own code
var mainpage = document.getElementById('main');
//define functions you want to make available to other people in a way that puts them in the global scope
setMainElement = function(newmain){mainpage = newmain;}
})();
あなたは1つのオブジェクトのみがグローバルすることによって、これがさらに良く行い、そのオブジェクトのメソッドを通して、あなたのinterfaeを提供することができ、この方法ライブラリに含まれるすべての関数を含む名前空間を作成します。次の例では、これを行うためにオブジェクトリテラルを使用しています。 javascriptでは、キー/値のペアを中括弧で囲んでオブジェクトを作成することができます。キー/値のペアはオブジェクトのプロパティです。たとえば、
(function(){
var privatevar = 10,otherprivate=20;
publicInterface = {
'addToPrivate': function(x){privatevar+=x;},
'getPrivate': function(){return private}
};
})();
正確には分かりませんが、あなたは関数*の外でfooの宣言を動かそうとしましたか? –
このリンクを試してください:https://developer.mozilla.org/ja/JavaScript/Reference/Functions_and_function_scope –