複数functionで共通の変数を使う



0   名前: Zig : 2007/07/21(土) 10:35  ID:ewlNXlpq sub-oi
初めまして。昨日からJavaScriptを始めました。
onclickで、クリックした場所にボタンを表示するfunctionを作っています。

ボタンを表示すると同時に、今まで表示していたボタンを消したいので、
前回クリックした場所を保存しておきたいのですが、

サンプルで見たことがある変数は全て、1つのfunction内だけで完結しています。
複数回呼出されるfunctionで一貫して使える変数というのは作れるのでしょうか?

1   名前: 匿名 : 2007/07/21(土) 10:35  ID:WdqtjdNB sub-Cz
こーゆーときにこそグローバル変数ってもんを使うんじゃねーかと。

グローバル変数を使いたくないということなら、関数と変数を 1 つのオブジェクトのメソッドとプロパティにして、名前空間っぽいことをすれば良いでせう。

いやそれも面倒だというなら、関数のプロパティにするという手もあります。

2   名前: ヨロズミタマ : 2007/07/21(土) 10:35  ID:kqesmFoG sub-gm
グローバル変数はvarを使わずに変数を宣言する。
//ローカル変数
var 変数名;

//グローバル変数
変数名;

ローカル変数とグローバル変数が同じ名前のときはローカルが優先されるようです。(自分は同じ名前にしないからあまり体験ないですが・・・。)

3   名前: 匿名 : 2007/07/21(土) 10:35  ID:QLNnC6mB sub-Cz
>>2
var Global = 1;

function Outer () {
    var localOuter = 2;
    
    function Inner () {
        var localinner = 3;
        
        Global;  // ???
    }
}

今、関数 Inner 内で変数 Global を参照したとします。エンジンはまず、関数 Inner 内を探しますが見つかりません。次に、親文脈である関数 Outer 内を探しますが、ここでも見つかりません。さらにその親文脈であるグローバル文脈を探すと、ついに Global が見つかります。

ここで、もし関数 Inner 内で var Global 宣言したらどうなるでしょうか。関数 Inner 内に変数 Global の宣言が見つかりますので、ここで探索終了となります。このとき、グローバル文脈の変数 Global には何も影響がありません。
var Global = 1;

function Outer () {
    function Inner () {
        var Global = 4;
        
        Global;  // 4
    }
    Inner ();
}

Outer ();
Global;  // 1

このように、文脈をさかのぼって変数を探す仕組みをスコープチェーンと呼びます。var 宣言というのは、スコープチェーンに変数を追加する仕組みです。

さて、関数 Inner 内で var 宣言せずに変数 Global2 を初期化してしまうと、スコープチェーンを次々にさかのぼって Global2 を探しますが、見つかりません。仕方がないので、スコープチェーンの最後尾であるグローバル文脈に、変数 Global2 を作成して初期化します。
function Outer () {
    function Inner () {
        Global2 = 4;
    }
    Inner ();
}

Global2;   // Error: not defined
Outer ();
Global2;   // 4

ですから、var 宣言せずに初期化した変数はグローバル変数になります。

もっとも、グローバルな文脈で var 宣言した変数も、やはりグローバル変数です。グローバル変数であろうとなかろうと、変数は var 宣言してスコープを明示すべきです



蛇足ながら、グローバル変数はグローバルオブジェクトのプロパティです。ブラウザ上では、グローバルオブジェクトは window に相当しますので、グローバル変数 Global は window.Global と等価です。

ローカル変数は、関数実行時に作成される不可視のオブジェクト Activation のプロパティとなります。

4   名前: Zig : 2007/07/21(土) 10:35  ID:70Y7/gpr sub-C7
遅くなって申し訳ありません。
書きこんだことをすっかり忘れてました orz

色々とありがとうございます。
大変参考になりました。

グローバル変数が使えるのも、
メソッドにプロパティがあるのも知りませんでした。
グローバルのオブジェクトがwindowだとか、知ってると便利そうですね。

一覧へ戻る