JSの変数について

このQ&Aのポイント
  • JSの変数の使い方を学びましょう。
  • 変数を使って効率的なコードを書きましょう。
  • 変数のスコープに注意しましょう。
回答を見る
  • ベストアンサー

JSの変数について

https://okwave.jp/qa/q9322322.html?by=agree#a_area の続き 確かにspeedBaseが変更されないと初期値が変わらないので 永遠にスピードが速くならないですね。 問題は下記のようにspeedを使っているので、speedBaaseとspeed変数の中身は同じなのに、 第二引数にspeedBaseという変数名であるとおかしいのでわざわざspeed変数に再代入しないといけない点です。 このような場合どう解決しますか? let speed = (speedBase = speedBase * 0.9); let setClickItem1 = setInterval(() => { let mathRandom = Math.random(); }, speed); >>> >speedBase++やspeedBase--の場合もグローバルになければクリックリスナーが終わればこの変数は消えてしまうのですね。 そのとおりです。 上記の演算式のパターンと比較して下さい、(ざっくりと言うと)「speedBase++」は「speedBase = speedBase + 1」と ほぼ等価、「speedBase--」は「speedBase = speedBase - 1」と ほぼ等価。 やはりグローバルにした時のみイベントリスナーが終わってもその中で宣言された変数は残り続けるのですね。 これは上のスコープであれば参照できるとは違うのですか? 参照はグローバルはもちろんどのスコープからでも参照できますがグローバルでない上にあるスコープなら 参照できますが、こちらはグローバル限定なのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

>回答No.2 amanojaku1 >ifブロックが (ブロックの構造的に)そのイベントリスナーに対応するとイメージして下さい(当然ifブロックとかならイベントで起動する訳ではないので現実的に このような場面は良く有ります)。 実際にはforループなどで そのような場面が多いです。 下記の場合、forループを抜けると変数「i」は消失し、変数「i」でカウントした値はforループ外では使えなくなってしまいます。 j = 0; for(let i = 1; j<=10; i++){ j = i+j; alert( 'i='+i+'; '+ 'j='+j+'; '+ ''); }

その他の回答 (2)

回答No.2

>>et speed = speedBase; >>let setClickItem1 = setInterval(() => { >>let mathRandom = Math.random(); >>}, speed); >>// ←ここで色々処理が有ったとして。 >>speedBase = speedBase * 0.9; // イベントリスナー内の最後に記述する。 >これはとても良いアイデアですね。思いつきませんでした。 >一度目は減らさなくて良いので減らさずに使って、 >最後に減らし次の回はすでに減っている値を使えば二度目からのみ減らすことが可能なのですね。 >順番を変えるだけでこんなことができるんですね。 処理の順番によって動作が変わってくるので、ソースは ある程度の塊(かたまり)で出して頂かないと、話がウマく伝わらないです(今回も これだけ やりとりして ようやく伝わりました)。 >global >{ >let a = 1; > >イベントリスナー{ >a = 1; >} > >} > >のようにグローバルではないが一つ上、親のスコープに宣言した変数はどうなのでしょうか? >恐らくグローバルだけが例外的にイベントリスナーが終了しても変数が残り続けるので、 >グローバル以外は残らないのでしょうね。 例えばローカル変数「a」が何らかのブロック(if文とか、ループとか、関数とか)で宣言(定義)されているとします。 イベントリスナーが終了しても、その(ローカル変数「a」が宣言(定義)されている)ブロックが終了してなければローカル変数「a」は有効です、そのブロックが終了すれば「a」は消失します(ただし これは あくまでも論理的な話です、イベントリスナーはイベントで起動するので、現実的に そのような場面があるかチョット疑問です)。 もう1度下記を見て下さい。 ifブロックが (ブロックの構造的に)そのイベントリスナーに対応するとイメージして下さい(当然ifブロックとかならイベントで起動する訳ではないので現実的に このような場面は良く有ります)。 ifブロックが終了したら、当然ローカル変数「d」は消失しますが、関数「abc」が終了してなければローカル変数「c」は有効です。 関数「abc」が終了したら、当然ローカル変数「c」は消失します。 >「変数、関数」にはスコープ(有効範囲)と言うモノがあります。 >下記プログラムで説明すると(「変数」はスクリプトがインタプリタに実行されてから「変数」が有効になります)。 >関数abcのスコープ(有効範囲)はグローバル。 >関数内関数bcdのスコープ(有効範囲)は関数abc内。 >変数aのスコープ(有効範囲)はグローバル。 >(引数bはabc関数内だけでなく関数外部との接点も持ってますが)ざっくりと言うと引数bのスコープ(有効範囲)はabc関数内。 >変数cのスコープ(有効範囲)はabc関数内。 >(引数eはbcd関数内だけでなく関数外部との接点も持ってますが)ざっくりと言うと引数eのスコープ(有効範囲)はbcd関数内。 >変数dのスコープ(有効範囲)はifブロック内。 > >a = 3; // 「var」を省略したグローバル変数の初期設定(グローバル変数の場合は こちらの方が便利です)。 >abc(a); >bcd(15); // エラーになる。 >function abc(b){ >let c = 3; >function bcd(e){ >alert('function bcd( ) : e = '+e); >} >if(b==c){ >let d = 4; >alert('function abc( ) : d = '+d); >} >alert('function abc( ) : d = '+d); // エラーになる。 >bcd(5); >}

回答No.1

>グローバルの領域でvarを省略して代入をすると、同じ名前の変数がグローバルにない場合、代入ではなくvarの省略した >変数の宣言になるのですね。 その辺のカッチリした正式な仕様は知りませんが、(ざっくりと言うと)暗黙の宣言みたいな感じで良いんじゃないでしょうか(正式な仕様と言う意味ではなく、あくまでも雰囲気としてです)。 >一つ目は代入でなく省略した宣言になりますが、二つ目はどうなるのですか? その変数が すでに出現している場合(二つ目)は、代入ですね。 >やはりグローバルにした時のみイベントリスナーが終わってもその中で宣言された変数は残り続けるのですね。 >これは上のスコープであれば参照できるとは違うのですか? >参照はグローバルはもちろんどのスコープからでも参照できますがグローバルでない上にあるスコープなら >参照できますが、こちらはグローバル限定なのでしょうか? すみません、「グローバルでない上にあるスコープ」意味がチョット分からないのですが…。 >let speed = (speedBase = speedBase * 0.9); >let setClickItem1 = setInterval(() => { >let mathRandom = Math.random(); >}, speed); ↑この場合、初期値の値が使えないですが、問題ないですか?、「speedBase = 2000」とした場合、1回目のクリックで「speedに1800が代入」されます。 もし1回目のクリックで初期値の値を使いたいのなら 下記のようになります。 let speed = speedBase; let setClickItem1 = setInterval(() => { let mathRandom = Math.random(); }, speed); // ←ここで色々処理が有ったとして。 speedBase = speedBase * 0.9; // イベントリスナー内の最後に記述する。 >第二引数にspeedBaseという変数名であるとおかしいのでわざわざspeed変数に再代入しないといけない点です。 すみません、意味がチョット分かりにくいですが、とりあえず こちらの認識で説明します。 「speed」ローカル変数自体をグローバル変数にするか、「speed」ローカル変数は使わずに「speedBase」グローバル変数だけにするかの、どちらかになります。 下記は「speed」ローカル変数自体をグローバル変数にした場合の例です。 // グローバル宣言 var speed = 2000; // イベントリスナー内の記述 let setClickItem1 = setInterval(() => { let mathRandom = Math.random(); }, speed); // ←ここで色々処理が有ったとして。 speed = speed * 0.9; // イベントリスナー内の最後に記述する。

htmlcss123
質問者

お礼

>>> >グローバルの領域でvarを省略して代入をすると、同じ名前の変数がグローバルにない場合、代入ではなくvarの省略した >変数の宣言になるのですね。 その辺のカッチリした正式な仕様は知りませんが、(ざっくりと言うと)暗黙の宣言みたいな感じで良いんじゃないでしょうか(正式な仕様と言う意味ではなく、あくまでも雰囲気としてです)。 >一つ目は代入でなく省略した宣言になりますが、二つ目はどうなるのですか? その変数が すでに出現している場合(二つ目)は、代入ですね。 一つ目はグローバルではvarがなくても代入ではなくvar省略の変数宣言になり、 同じ変数名がある二つ目の場合はグローバルでも代入になるのですね。 >>> すみません、「グローバルでない上にあるスコープ」意味がチョット分からないのですが…。 global { let a = 1; イベントリスナー{ a = 1; } } のようにグローバルではないが一つ上、親のスコープに宣言した変数はどうなのでしょうか? 恐らくグローバルだけが例外的にイベントリスナーが終了しても変数が残り続けるので、 グローバル以外は残らないのでしょうね。 >>> let speed = speedBase; let setClickItem1 = setInterval(() => { let mathRandom = Math.random(); }, speed); // ←ここで色々処理が有ったとして。 speedBase = speedBase * 0.9; // イベントリスナー内の最後に記述する。 これはとても良いアイデアですね。思いつきませんでした。 一度目は減らさなくて良いので減らさずに使って、 最後に減らし次の回はすでに減っている値を使えば二度目からのみ減らすことが可能なのですね。 順番を変えるだけでこんなことができるんですね。 >>> わかりにくくてすいません。 第二引数とは下記のspeedの部分のことです・ let speed = speedBase; let setClickItem1 = setInterval(() => { let mathRandom = Math.random(); }, speed); このspeed変数はこのスピードで繰り返し実行するようにするための秒数なので、 ここがspeedBaseという変数名だとおかしいですよね。 変数名としておかしいという意味です。 例えば中身1なら1秒ごとに繰り返せになるので、 その1が入っている変数はspeedBaseよりspeedの方が正しいと思うという事です。 Baseはあくまで0..9×前の基準の秒数なので。

関連するQ&A

  • 変数の宣言をグローバルにしないと変数の参照が出来ま

    変数の宣言をグローバルにしないと変数の参照が出来ません。 ソース全体はカプセル化のために即時関数で囲っています。 function found内で小数点第三位までで四捨五入するようにする処理が共通なので関数化したのですが、 var gramNumを外で宣言しないと参照できずにgramNumが定義されていないと出てしまい困りました 関数スコープの影響だと思い宣言を外に出したのですが、それでも定義されていないと出て、 最終的にグローバル変数にしてやっとうまくいきました。 スコープは自分より上のスコープの変数は参照できるようですが if(xGramEmptyFlag === true) {ないの式がroundの上にあるvar gramNumを参照する場合、 if分の中にある式の一つ上のスコープなので参照できると思ったのですがなぜできないのでしょうか? varはブロックスコープがないので一つ上ではなく同じスコープにあることになるのでしょうか? ただその場合も同じスコープの変数は参照できるのではないのでしょうか?

  • 変数に入っている変数の値を参照したい場合には

    var a1="123"; var a2="789"; と 変数に文字が登録されている場合、 引数として、1又は2を渡し、 1の場合にはa1を 2の場合にはa2の値を 参照することは可能ですか? switchやif文を使わずに、 別の変数に、"a"+引数を代入し、 その変数に代入されている変数を参照する というようなことは可能ですか? 意味わかりますか? すみません。 よろしくお願い致します。

  • rubyにおける変数と代入のメモリの様子について

    Rubyの変数と代入演算は、メモリについてどのような扱いになっているのでしょうか。2点ほど疑問電があります。 1点目:代入演算は変数にアドレスを渡しているのか RubyLifeのRuby入門のサンプルをみて学習していたところ疑問がわきました。 http://www.rubylife.jp/ini/var/index4.html を参照しながら示します。 str1 = "Tokyo" str2 = str1 str1 << ",Japan" とやるとstr1もstr2も"Tokyo,Japan"となることから、rubyでの代入演算はアドレスを代入してると考えました。 2点目:新しくオブジェクトを代入すると別メモリ領域において、そのアドレスを代入しているのか str1 = "Tokyo" str2 = str1 str1 = "Osaka" とやると、str1は"Osaka"、str2は"Tokyo"となります。 前述の参照渡と考えるとstr2も"Osaka"となっているはずですが違いました。 ここで解説に(引用はじめ) なお2つの変数が同じオブジェクトを指し示した後で、どちらかのオブジェクトに新しいオブジェクトを 代入した場合は、代入された変数が指し示すオブジェクトだけが変更されるだけです。(引用おわり) とあります。 このことをふまえると、新しいオブジェクトを変数に代入するというのは、別のメモリ領域をつくってデータを置いてから、そのアドレスを変数に代入している、と考えました。 これら2つの考えと実際の仕組みは一致しているのでしょうか、と言うのが質問です。 質問点をまとめると、Rubyにおいて変数に対して ・代入演算はアドレスを代入しているのか(Cでいうポインタの扱いなのか) ・新しいオブジェクトを代入するときには、新メモリ領域を作ってデータを入れてそのアドレスを代入しているのか という点です。 ついこの間はじめたばかりの初心者ですが、どうかご教授よろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • JSのクラスについて

    JSのクラスについて https://okwave.jp/qa/q9320085.html の続き >>> >するとCat.nameとなりCatクラスという箱の中に入っているnameプロパティ?いや引数という事なのでしょうか? 引数ではなくプロパティです、ここではクラス内部のローカル変数と説明しているモノです(初心者に分かりやすいか どうかは別としてプロパティと言った方が正確ですね)。 関数内部(関数が持っている)のローカル変数は ご存知ですか?、それに類似しています、この場合はクラス内部(クラスが持っている)のローカル変数と言うイメージです。 Cat.nameとなりCatクラスという箱の中に入っているnameプロパティなのですね。 nameとコンストラクタの引数があるのでthis.nameのnameも引数なのかと思ったのですが、ドットつながりなのでcatクラス(オブジェクト)の中にあるnameプロパティ という事ですね。 関数のスコープの中で宣言する変数のことですよね。 巻き上げが起こる変数ですね。 これとクラス内の変数はほぼ同じ挙動をするという事ですか? するとスコープがクラスにもあるのでしょうか? 巻き上げも >>> >なぜこの例えはこんなわかりにくいことをしたんですかね? 恐らく同じ名前でも「this.」が付いてるか付いてないかで区別できるので、同じ名前でもコンフリクト(衝突、競合)せずに使えると言う例を示したかったのかもしれません。 thisで別の引数?の物と区別できるという事を伝えたかったのですね。 ただ二つはコンストラクタの引数でthis.nameだけはそもそも引数ではなくプロパティなので、 仮にかぶっても問題ないのでしょうね。 >>> >変数と似ている箱で 変数と違う箱と考えて下さい。 オブジェクト、クラス、関数、変数などいろいろな箱がありこんがらがるのですが、 もしかしてこれらはすべて変数なのですか? つまり箱はすべて変数で、これらは少し個性の違う変数なのでしょうか? >>> >特殊な箱でなんでも好きに入れ替えできず、 >入れられるものと入っていなくても良いものが固定されている箱という事でしょうか? >つまり変数と違ってコンストラクタが絶対に入っている箱なのですね。 初期設定が必要ないなら、コンストラクタは必要ないようです。 クラスをインスタンス化したい場合のみコンストラクタは必要で、 インスタンス化が不要なクラスなら必要ないという事でしょうか? ただクラスはインスタンス化しないと利用できないので、 文法上はコンストラクタなしでも良いが、実際はそのようなことはあり得ないという事でよいでしょうか? またインスタンス化と初期設定の違いが判らないのですが、イコールと考えてよいでしょうか? >>> >入れられないものもあるのですか? クラス内クラスは無理なようです。 それ以外はオブジェクトのように入れられるのですね。 >>> >var コンストラクターの「name」= my cat;という事ですかね? その説明は変な感じです、実際のプロセスを考えて下さい(「my cat」ではなく"my cat"文字列です)。 new Cat("my cat") ←ここでコンストラクターの「name」仮引数に"my cat"文字列が代入され、「constructor(name) {this.name = name}」が呼ばれます。 constructor(name) {this.name = name} とは constructor関数の中に中カッコ内の式があり、 catクラス内のnameプロパティにconstructorの引数nameを代入するという事ですよね。 不思議なのはconstructorの引数nameを代入する部分なのですが関数の引数を代入するというのは初めて見ました。 仮引数nameなので constructor(name) { var name = "my cat"; this.name = name } という事ですよね。 つまり下記のcatクラスの引数が実引数になるという事ですよね。 //インスタンス作成 var clsObj = new Cat("my cat"); 関数であれば関数の呼び出しにある引数が実引数として代入されますが、 クラスの場合はconstructor関数の呼び出しにある引数ではなく クラスのインスタンス化にある引数が実引数として代入されるというルールなのですね。 constructor関数の呼び出しがないのが不思議でしたが、 constructor関数は定義するだけで呼び出しはしなくても実行されて、インスタンスを作成するのですね。 そして constructor(name) { var name = "my cat"; this.name = "my cat" } となりプロパティnameに文字列mycatが代入されるのですね。 >>> 「インスタンスの引数」と言うのは違います。 new Cat("my cat"):Catクラスに実引数"my cat"文字列を設定しnewすると、コンストラクターの「name」仮引数に"my cat"文字列が代入され、「constructor(name) {this.name = name}」が呼ばれ、インスタンスが生成されます。 こちらも上記の説明で正しいでしょうか? >>> コンストラクターが在る場合もコンストラクターは初期設定だけです。 クラス"設計図"からインスタンス"実態"を作成すると言う事で、例えるなら十徳ナイフの"設計図"から十徳ナイフの"実態"を作成すると言うイメージして下さい。 (十徳ナイフの"実態"を作成しても)十徳ナイフが置いてあるだけでは何も役に立ちません、十徳ナイフは使ってこそ役に立つ訳です、例えば十徳ナイフの「栓抜き」(機能)を使うと言うのが「栓抜き」メソッド、「缶切」(機能)を使うと言うのが「缶切」メソッドに対応すると言うイメージです。 なるほどクラスがナイフの設計図で、constructor、newクラス名がナイフを作るための作業で、 ナイフがインスタンス化されたオブジェクトですが、この時点では何のメリットもないのですね。 インスタンス化されたオブジェクトを使う作業がメソッドという事ですね。 下記例ですとnew Cat("my cat");がナイフを具現化する作業(constructorもこれに当たる?)で、 実際に使うメソッドはここにはないのですかね? class Cat { (name) {this.name = name} meow() {alert( this.name + 'はミャオと鳴きました' )} } //インスタンス作成 var clsObj = new Cat("my cat"); //インスタンス(オブジェクト)の中身を出力 console.log(clsObj); >>> 仮引数とローカル変数(プロパティー)とは違います。 ローカル変数(プロパティー)はクラスの箱の中に定義されるモノです(添付画像参照)。 上記でも記載した、仮引数と実引数が実質var name = "my cat";というローカル関数と同じ結果になるという意味で書いたのですが、 それでも違うでしょうか? もちろん同じものではないですが、実質同じ結果にはなるのですよね。 >>> そして constructor(name) { var name = "my cat"; this.name = "my cat" } となりプロパティnameに文字列mycatが代入されるのですね。 下記が同じ結果になるという意味なのでしょうね。 >>> 申し訳ございません訂正です、引数を引数としか考えてませんでしたが、ローカルと言われれば確かに引数もローカル変数でした。 関数のローカル変数とインスタンスのプロパティーは類似していますが、インスタンスのプロパティーは値が保持されます。 ちなみに(コンストラクター以外は)クラスの構造がインスタンスの構造に反映されます(添付画像参照)。 関数のローカル変数とインスタンスのプロパティーは類似していますが、インスタンスのプロパティーは値が保持されます。 ここがよくわからないのですがconstructor(name)のnameは引数ではなくプロパティなのですか? 見た目は引数に見えますが、違いとしてはプロパティは値が入れられる箱であり、 仮引数はローカル変数名でしかなく、ローカル変数そのものではないので、箱ではなく、値を入れられないのですかね?

  • String型の変数に代入されている2つの文字列を論理演算したいです。

    String型の変数に代入されている2つの文字列を論理演算したいです。 上記の通りなんですけど 例えば String a = "あいうえお"; String b = "aiueo"; このような二つの文字列を論理演算したあと 16進数の文字列としてあらたな変数(String型)に代入したいのですが どのように記述すればよろしいでしょうか? 初心者なものでわかりやすく説明していただけるとありがたいです。

    • ベストアンサー
    • Java
  • JavaScriptの変数への代入について

    <単純なデータ型> 1. 以下のようなケースでxに5という値を代入すると1行目の「let x = 1;」で「x」の値が5に変わるというのは理解できます。 この場合、2行目は「y」の値は「1」のままです。「5」でないのがわかりません。 代入したことによって「let y =x」へは影響を及ぼさないのはなぜですか? 少なくともスコープの範囲以内は代入の影響が出るものと考えてしまいます。 { let x = 1; let y = x; x = 5; console.log(x); //5 console.log(y); //1 } <配列> 2.このような配列の場合、「x[0]」に配列である[1, 2];が代入されているわけですよね。 以下のように「x[0]」に5を代入した場合、console.logで見てみると、[5, 2]となるのは理解できます。 しかし、2行目の「let y = x;」も[5, 2]となっています。 上の単純なデータ型のケースをもとに考えるならば、ここは[1, 2]のままでないのはなぜなのでしょうか? 試しに自分で「x[1]」に書き換えてみると両方とも「1, 5」となります。 { let x = [1, 2]; let y = x; x[0] = 5; console.log(x); //[5, 2] console.log(y); //[5, 2] } なぜ、単純なデータ型と配列ではパターンが異なってくるのでしょうか? 初心者です。学習中でまだ基礎的な段階なのですが、つまづいてしまいました。 分かる方いらっしゃいましたら教えて下さい。よろしくお願いいたします。

  • 他の関数内にあるsetinertvalを参照できな

    clearInterval(timer0);が他の関数内にあるsetinertvalを参照できない。 エラーになってしまいます。 let startSlot = (()=> { let timer0 = setInterval(() => { 内容 }, interval); })(); // stopSlot let stopSlot = (()=> { const stop0 = document.getElementById('stop0'); const stop1 = document.getElementById('stop1'); stop0.addEventListener('click', ()=> { clearInterval(timer0); }); })(); 勝手にカプセル化してしまう スコープの問題に非常に悩むのですがどう対処しますか? let iterative = { setTimeout(myChange , 5000); // } とした場合ちゃんと止まっていますのでスライドショーに問題はないです 停止は上記でできるがこれですと名前のある関数にできないので再度動かすことができないのです。 var playBtn = document.getElementById('js-play-btn'); playBtn.addEventListener('click', function () { _iterative(); }); が変数に代入しただけではできないですよね – よい回答を頂けないので、いろいろな所で聞いています。

  • 参照なバリアント

    VB熟達者というよりは、VBマニアな方々に質問です。 Sub Hoge(A) A = 6 End Sub Sub Main() Dim N As Long Hoge N Debug.Print N End Sub このコードを実行して "6" が出力されるのは明白です。 Hogeはバリアントの参照を取るにも関わらず、LongのNを渡してそのNに6を入れてくれました。 これは、VBが引数を渡す時点で変数A用のメモリ領域をかってに確保し、Nという変数の参照型を作ったということの証拠になります。 実際、DLLでAPIを用意して、バリアント構造体のVarTypeを調べたところ、未知の16387という数値が現れました。 これは、MSDNライブラリを見たところ、VT_LONG Or VT_BYREFのようです。 このように、VBでも参照型は存在していますが、隠蔽されています。 そこで、参照型をもっと自由に使いたいと思い、参照型を作るAPIを作ってみました。 しかし、=演算子で代入しようとしたところ、参照が解除されて通常のバリアント型に戻ってしまいます。 ただし、もともとある変数の参照であるバリアント変数を別の変数の参照に変えたもののときは、参照先に代入してくれました。 どうやらVBはケチなようで、VBが内部で引数として作った参照変数以外は、参照している先に代入はしてくれないようです。 この障害を乗り越える方法を思いついた方、ぜひ教えてください。

  • Perlインクリメントデクリメント

    あっていますでしょうか? インクリメント演算子とデクリメント演算子 インクリメント(加算)演算子は変数の数値を一つ増やす。 デクリメント(減算)演算子は変数の数値を一つ減らす。 ++ インクリメント演算子 変数の値を1増やす $a++ ++$a $aの値を1増やす -- デクリメント演算子 変数の値を1減らす $a-- --$a $aの値を1減らす $a=1; 変数$aに1を代入する print "はじめは$aでした。\n"; $aの代わりに1が入り はじめは1でした。と表示する。 $a++; $aに1を足す。 print "1増えて$aになりました。\n"; $aの代わりに2が入り、1増えて2になりました。 と表示する。 $a--; $aから1減らす。 print "1減って$aに戻りました。\n"; $aの代わりに1を入れて 1減って1に戻りました。 と表示する ↓ 実行結果 ↓ はじめは1でした。 1増えて2になりました。 1減って1に戻りました。 $a++ と ++$a の違い インクリメント演算子、デクリメント演算子には2通りの書き方があります。 ++$a(前置)と$a++(後置) --$a(前置)と$a--(後置) 前置の場合は変数の参照より先に演算が行われます。 後置の場合は変数の参照より後に演算が行われます。 $x=$a=1; 変数$xと$aに1を代入する。 $x=++$a; $aに1を足した後に$xに代入する。$xの値は2になる。 $x=$a=1; 変数$xと$aに1を代入する。 $x=$a++; 変数$aの値を$xに代入した後に$aに1を足す。$xの値は1。 文字もインクリメント出来ます。 $x="A"; "A"を$xに代入する。 $x=++$x; Aから一つ増やしてBにして$xに代入する。 $x="aaa"; "aaa"を$xに代入する。 "aaa"を一つ増やして"aab"を$xに代入する。 ただし、文字のデクリメントはできません。

    • ベストアンサー
    • Perl
  • グローバル変数以外も変数は残り続ける?

    https://okwave.jp/qa/q9323518.html の続き var stoppingNow = false; がグローバル変数になっていないので仕様上はページ読み込み時に実行されて処理が終わった瞬間に この変数は削除されて使えなくなると聞いたのですが、 なぜかpauseBtnを押した後に、playBtnを押すと問題なく使えてしまいます。 グローバルにない変数は、stoppingNow = true;を実行してもそんな変数もうないとなるはずなのですよね? それともグローバルにない変数も残っていて、代入の処理よりも上、ないしは親のスコープにあれば使えるのが仕様なのですか? (function () { var stoppingNow = false; var pauseBtn = document.getElementById('js-pause-btn'); pauseBtn.addEventListener('click', function () { clearTimeout(it); stoppingNow = true; }); var playBtn = document.getElementById('js-play-btn'); playBtn.addEventListener('click', function () { if (stoppingNow === true) { iterative(); stoppingNow = false; } }); } myChange(); })();