1

これが私のコードです

var a = this.innerHTML;

var b = 'blababibbaib';

if(a !== b)
    {
        c = a;
        return this.innerHTML = b;
    }
else
    {
        return this.innerHTML = c;
    }

そしてvarで

var a = this.innerHTML;

var b = 'blababibbaib';

if(a !== b)
    {
       var c = a; // here with the var it makes c undefined :-(
        return this.innerHTML = b;
    }
else
    {
        return this.innerHTML = c;
    }

私がこれを行っていた理由は、元の変数 b と var b の間を行き来する onclick イベントの関数が必要だったからです。本当に楽しいだけです。

しかし、 c 変数の前に var を追加すると、クリックすると未定義になる理由がわかりません。誰かが私を照らしてくれますか?

関数で使用すると、変数のスコープと関係があると思います????

前もって感謝します :-)

編集:

さて、var で宣言するためにこれを行いましたが、正確な理由はまだわかりません。

関数の外で、宣言する前に c の if チェックを追加しました

if(!c) var c = '';

しかし、私が言ったように、私はまだ何が起こっているのか、そしてその理由を聞きたいと思っています ありがとう :-)

編集 2: ホイストについて読んでくれてありがとう。

私は混乱していたと思います.cもチェックする必要はないようです. 思考は重要かもしれません...まあ。再度、感謝します

4

6 に答える 6

4

2 番目の例で起こっていることは、これと同等です。

var a = this.innerHTML;

var b = 'blababibbaib';

var c; // all "var" are hoisted to the top of a function body

if(a !== b)
    {
        c = a;
        return this.innerHTML = b;
    }
else
    {
        // local c variable not set yet - undefined
        return this.innerHTML = c;
    }

c設定されていない場合にのみ出力されるため、明らかにここでは定義されていません。あなたが実際に望んでいるのは次のとおりだと思います:

var a; //This persists after the function is invoked

myelement.onclick = function () {
    if (!a) { // Only save the value if it isn't already set
        a = this.innerHTML;
    }
    var b = 'blababibbaib';

    if (this.innerHTML == b) {
        return this.innerHTML = a;
    } else {
        return this.innerHTML = b;
    }
};

ここで見ることができます。

最初のスニペットに関する限り、 の値はc関数に対してローカルではなく、呼び出し後も持続するため、機能します。varキーワードを使用して変数を宣言せずに、関数本体で変数を代入または参照するwindowと、同じ名前のプロパティが自動的に参照されます。次の点を考慮してください。

window.c = "Hello, world.";

//Note how there is no local c variable;
//the c here refers to window.c
function test1(){
    alert(c);
}

//There is a c variable local to the 
//function, so the value alerted is not the value of window.c
function test2(){
    var c;
    alert(c);
}

test1(); // alerts "Hello, world."
test2(); // alerts "undefined"

最初のスニペットでは、HTML が でないときは常に の値をwindow.cに変更しています。値の場合、要素の をリセットするために依存しています。this.innerHTML"blababibbaib" "blababibbaib"window.cinnerHTML

暗黙のグローバルと同様に、JS での巻き上げについて読みたいと思うかもしれません。

于 2013-01-07T03:35:05.007 に答える
1

これはおそらく、変数cが if ステートメントにのみ存在するため、次のようにする必要があるためです。

var a = this.innerHTML;

var b = 'blababibbaib';
var c;
if(a !== b)
    {
       var c = a; // here with the var it makes c undefined :-(
        return this.innerHTML = b;
    }
else
    {
        return this.innerHTML = c;
    }

最初のコードでは、グローバル変数var cを作成する を使用していないためです。c

于 2013-01-07T03:35:38.283 に答える
1

varプレフィックスがないc場合はグローバル変数になり、すべてのスコープで使用できます。

JavaScript には関数スコープしかないためvar、変数を最新の関数コンテキスト (または関数内で宣言されていない場合はグローバル スコープ) にスコープします。

于 2013-01-07T03:35:03.340 に答える
0

特定のスコープ内の変数に新しいメモリを割り当てない場合、デフォルトでは、親スコープ チェーンの名前に一致する変数が使用されます。

「var」キーワードを使用すると、現在のスコープでメモリ割り当てがトリガーされます。それ以外の場合は、関数の呼び出し全体で永続的なウィンドウのメンバーとして値が割り当てられます。

于 2013-01-07T03:37:28.470 に答える
0

あなたの論理に従うと、 c は if でのみ設定され、else では設定されません。したがってc、関数の外に存在するグローバル変数の場合、呼び出し間で「状態」を維持できます。内部で宣言するとvar、各呼び出しに対してローカルになります。

于 2013-01-07T03:34:50.297 に答える
0

これは少しややこしいですが、知っていれば覚えやすいはずです。変数を定義するときにキーワードを省略するvarと、変数はグローバル スコープにアタッチされます。これは一般に、適切に作成されたプログラムでは望ましくありません。これは、スコープの有効期限が切れたときに破棄されるべき変数が浮遊しているためです。

あなたの場合、ステートメントvar c = a内に を追加するとif、javascript が自動的に変数を関数スコープに巻き上げvar c = aますが、変数名は存在しますが、コード行に遭遇するまで値を割り当てません。デフォルトでは、値が割り当てられていない変数はすべてundefined状態を取得します。

を省略した場合varcはグローバル スコープに昇格しc、ページにいる限り、グローバル ステートはその値を保持します。したがって、else節に戻ると、 の有効な - しかし古い - 値が得られますc

経験則として、変数を定義せずvarに定義することはお勧めできません。特に C/C++/ジャバ背景。

于 2013-01-07T03:42:51.800 に答える