• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:変数の宣言をグローバルにしないと変数の参照が出来ま)

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

このQ&Aのポイント
  • 変数の宣言をグローバルにしないと変数の参照が出来ません。
  • 関数内で共通の処理を関数化した際に、外部で宣言されていない変数を参照できずに困りました。
  • スコープの影響で、同じスコープの変数は参照できるはずですが、なぜ参照できなかったのでしょうか?

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

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

>回答No.1 amanojaku1 そもそも この「function round(gramNum)」関数の場合、引数は要らないですよね? もし引数が必要ないのなら下記のように記述できます。 function round() { var gramNum; // ←スコープは関数内のローカル gramNum = shoppingCalcGram * 1000; gramNum = Math.round(gramNum) / 1000; }

okweb12345
質問者

お礼

確かに要らないのですが、入れないと中の変数が参照できないと思い入れました。 呼び出しの際に引数に何もないと関数スコープの中身が見れないのですか???

okweb12345
質問者

補足

今度は関数の引数を使って同じ処理を何度も行わないようにしようと思ったのですが、 1つあたり' + roundNum のroundNumがundefunedになってしまいます。 小数点をいじる関数の中では問題ないのになぜ表記する処理の際にundefunedに変更されてしまいます。 変数をグローバル変数にしてもundefinedになってしまうのですが、グローバル変数にするとすべての処理が終了するまで中身が保持し続けると思ったのですが、 保持される範囲はどうなっているのですかね? 同じスコープとそれより上のスコープの変数の中身はほじされるんでしたっけ?

その他の回答 (8)

回答No.9

>コンソール上でやってみましたがundefinedになってしまいます。 >function round(roundNum) { >roundNum = roundNum * 1000; >}; > >round(7); 下記のように単純なプログラムでは「alert(roundNum);」の表示は「7」となっており、正常に引数を渡せています。 やはり即時関数をやめてみては如何でしょうか?、別ファイルを作って試してみて下さい。 <script type="text/javascript"> function round(roundNum) { alert(roundNum); roundNum = roundNum * 1000; roundNum = Math.round(roundNum) / 1000; } round(7); </script>

okweb12345
質問者

お礼

出来ましたありがとうございます。 インスぺくたの仕様でundefinedと出ているだけでした

回答No.8

>回答No.7 amanojaku1 >>ただ全く別物で何の関係もないとすると、なぜグローバル変数を付けないとundefinedになってしまうのでしょうか? > >バグかJavaScriptの言語仕様か良く分かりませんが、前述した通り(グローバル変数を付けると)undefinedエラーになりませんが、結局 内部的にはundefinedです。 この説明だと実際に何が言いたいのか分かりにくいと思いますので下記を実際に実行してみて下さい。 undefinedエラーは発生しませんが、「alert(roundNum);」の結果はundefinedです。 <script type="text/javascript"> function round(roundNum) { alert(roundNum); roundNum = roundNum * 1000; roundNum = Math.round(roundNum) / 1000; } shoppingCalc = 3; shoppingCalcGram = 5; roundNum = shoppingCalc; round(); roundNum = shoppingCalcGram; round(); </script>

回答No.7

>関数内のroundNumとグローバルなど関数外の物は同じ変数名でも別の変数になっているという意味でしょうか? そうです。 >例えばアメリカの山田さんと日本の山田さんは同じ名前だがなんの関係もない赤の他人と同じという事でしょうか? そうです。 >ただ全く別物で何の関係もないとすると、なぜグローバル変数を付けないとundefinedになってしまうのでしょうか? バグかJavaScriptの言語仕様か良く分かりませんが、前述した通り(グローバル変数を付けると)undefinedエラーになりませんが、結局 内部的にはundefinedです。 >「undefined」エラーになりませんが、関数内のスコープのroundNumの値は「undefined」です、下記を実行してみて下さい。 > ><script type="text/javascript"> >function round(roundNum) { >alert(roundNum); >roundNum = roundNum * 1000; >roundNum = Math.round(roundNum) / 1000; >} >shoppingCalc = 3; >shoppingCalcGram = 5; >roundNum = shoppingCalc; >round(); >roundNum = shoppingCalcGram; >round(); ></script> >function round(roundNum) { >roundNum = roundNum * 1000; >} >自体が不要で何の意味もない独立した処理が存在しているという事でしょうか? ↑これ「round(7);」とかで普通に呼べませんか? >>(function () { >↑これは何をしてますか? >これは即時関数を使って全体をカプセル化しています。 ↑即時関数をやめてみては?、別のファイルを作って試してみて下さい。 >下記認識も正しいのですね。 >>>>>>> >(function () { > >function round(roundNum) { >roundNum = roundNum * 1000; >} >は >function round() { >var roundNum; >roundNum = roundNum * 1000; >} >と全く同じ状況 roundNumがスコープが関数内ローカルと言う意味では同じです。

okweb12345
質問者

お礼

>>> >ただ全く別物で何の関係もないとすると、なぜグローバル変数を付けないとundefinedになってしまうのでしょうか? バグかJavaScriptの言語仕様か良く分かりませんが、前述した通り(グローバル変数を付けると)undefinedエラーになりませんが、結局 内部的にはundefinedです。 完全に独立しているならグローバルに同じ名前の変数が宣言されているかいないかも全く関係ないように思えるのですが、 なぜ全く関係ないのにこれがないとうまくいかないのですかね? 関係ないならグローバル変数は不要な気がしますが >>> >下記認識も正しいのですね。 >>>>>>> >(function () { > >function round(roundNum) { >roundNum = roundNum * 1000; >} >は >function round() { >var roundNum; >roundNum = roundNum * 1000; >} >と全く同じ状況 roundNumがスコープが関数内ローカルと言う意味では同じです。 関数内に仮引数名の変数を定義したことと全く同じと考えて判断すれば挙動は理解できるという事で良いのですね。 ありがとうございます コンソール上でやってみましたがundefinedになってしまいます。 function round(roundNum) { roundNum = roundNum * 1000; }; round(7); undefined

回答No.6

>回答No.5 amanojaku1 >「undefined」エラーになりませんが、関数内のスコープのroundNumの値は「undefined」です、下記を実行してみて下さい。 > ><script type="text/javascript"> >function round(roundNum) { >alert(roundNum); >roundNum = roundNum * 1000; >roundNum = Math.round(roundNum) / 1000; >} > >shoppingCalc = 3; >shoppingCalcGram = 5; > >roundNum = shoppingCalc; >round(); >roundNum = shoppingCalcGram; >round(); なにが言いたいかと言うと 「function round(roundNum)」関数内においてroundNumのスコープは関数内ローカルです。 グローバル変数「roundNum」の値は「function round(roundNum)」関数内のroundNumに対し関与していません。

okweb12345
質問者

お礼

>>> なにが言いたいかと言うと 「function round(roundNum)」関数内においてroundNumのスコープは関数内ローカルです。 グローバル変数「roundNum」の値は「function round(roundNum)」関数内のroundNumに対し関与していません。 関数内のroundNumとグローバルなど関数外の物は同じ変数名でも別の変数になっているという意味でしょうか? すると下記だ正しそうですね >>> グローバルにvar roundNum;がなければ一切var roundNum;にアクセスできないので中で何が起きてもきっさい外からアクセスできないので、 外から見るとvar roundNum;を全く利用できずに影響も請けないという事の方が正しい解釈ですかね。 例えばアメリカの山田さんと日本の山田さんは同じ名前だがなんの関係もない赤の他人と同じという事でしょうか? ただ全く別物で何の関係もないとすると、なぜグローバル変数を付けないとundefinedになってしまうのでしょうか? ただ宣言をどこか参照できる場所で行わないといけないだけで別にグローバル変数にする必要はないという事でしょうか? つまり function round(roundNum) { roundNum = roundNum * 1000; } 自体が不要で何の意味もない独立した処理が存在しているという事でしょうか? やりたいことは関数内の処理結果がグローバル変数に入って、 それを参照して小数点を四捨五入した結果が出るということです。 この作業を回数文書いてもできますが、それだとよろしくないので同じ処理を関数化しようとしてはまったという事です。 また、 下記認識も正しいのですね。 >>>>>> (function () { function round(roundNum) { roundNum = roundNum * 1000; } は function round() { var roundNum; roundNum = roundNum * 1000; } と全く同じ状況

回答No.5

>round(shoppingCalc);というかたちにすれば >下記は問題なく実行され そうですね。 >その後、roundNumは下記関数外でも参照できるのではないでしょうか? 関数内のスコープのroundNumが使われているハズですので、関数外からは参照できないハズです。 >その後下記のように一部変更することで結果は出ました。 >1 >var roundNum = shoppingCalc; >round(); >2 >var roundNum = shoppingCalcGram; >round(); それは変です,簡単なプログラムでチェックした結果、確かに「undefined」エラーになりませんが、関数内のスコープのroundNumの値は「undefined」です(Firefoxで実行)。 重要なので2度言います、「undefined」エラーになりませんが、関数内のスコープのroundNumの値は「undefined」です、下記を実行してみて下さい。 <script type="text/javascript"> function round(roundNum) { alert(roundNum); roundNum = roundNum * 1000; roundNum = Math.round(roundNum) / 1000; } shoppingCalc = 3; shoppingCalcGram = 5; roundNum = shoppingCalc; round(); roundNum = shoppingCalcGram; round(); </script>

okweb12345
質問者

お礼

>>> 下記は問題なく実行されその後、roundNumは下記関数外でも参照できるのではないでしょうか? (function () { function round(roundNum) { roundNum = roundNum * 1000; } は function round() { var roundNum; roundNum = roundNum * 1000; } と全く同じ状況になるので、var roundNum;は関数スコープ内にできる結果この関数内でしか参照できないようになるため、 グローバルにvar roundNum;を宣言しておかないと関数内のvar roundNum;が変更されてもその変更後の値にアクセスできず、 undefinedになってしまうという事でしょうか? グローバルにvar roundNum;がなければ一切var roundNum;にアクセスできないので中で何が起きてもきっさい外からアクセスできないので、 外から見るとvar roundNum;を全く利用できずに影響も請けないという事の方が正しい解釈ですかね。 引数を空にすることによって?? うまく動いています。 ただグローバルに変数を宣言しないとうまくいかず、このやり方では管理しにくいです。 諦めるしかないでしょうか?

回答No.4

>(function () { ↑これは何をしてますか? > function round(roundNum) { > roundNum = roundNum * 1000; > roundNum = Math.round(roundNum) / 1000; > } ↑今回はroundNumの値を(演算に)使っているのでnullではダメです、適切な値を設定して下さい。 >下記のようにnullを入れてみましたがやはりうまくいきません。 >undefinedになってしまいます。 とりあえず難しいプログラムでなく下記の単純なプログラムでチェックしてみて下さい(正常に実行できるハズです)。 <script type="text/javascript"> function round(roundNum) { roundNum = roundNum * 1000; roundNum = Math.round(roundNum) / 1000; alert(roundNum); } round(7); </script>

okweb12345
質問者

お礼

>(function () { ↑これは何をしてますか? これは即時関数を使って全体をカプセル化しています。 その後下記のように一部変更することで結果は出ました。 1 var roundNum = shoppingCalc; round(); 2 var roundNum = shoppingCalcGram; round(); ただ不思議なのはグローバル変数を削除して ; round(shoppingCalc);というかたちにすれば 下記は問題なく実行されその後、roundNumは下記関数外でも参照できるのではないでしょうか? (function () { function round(roundNum) { roundNum = roundNum * 1000; } 関数スコープが出来てしまっているので、問題なく上記は実行されroundNumの中に結果は代入されているが、 この関数内でしか参照できない状態になっており、 グローバル変数が必要になっているという解釈の方が正しいでしょうか? その場合グローバル変数無しにもっとスマートに実現する方法は存在しないのでしょうか? いつもスコープのためだけにグローバル変数をこんなに離れたところに作るのは管理性の問題があるようで気に入りません。

回答No.3

>変数をグローバル変数にしてもundefinedになってしまうのですが、グローバル変数にするとすべての処理が終了するまで中身が保持し続けると思ったのですが、 >保持される範囲はどうなっているのですかね? 順番に考えて下さい。 まず、関数内(関数内スコープ)だけ考えて下さい。 関数を「function round(gramNum){~}」と定義したとします。 関数を「round()」で呼び出すと実引数が定義されていません(つまり実引数は未定義となります)。 その結果、定義側の「function round(gramNum){~}」の仮引数「gramNum」は「undefined」になります。 例えば「round(null)」で呼び出せばエラーにならないはずです。 >変数をグローバル変数にしてもundefinedになってしまう 次に関数の外を考えましょう。 グローバル変数「gramNum」を定義しても、既に関数内で仮引数「gramNum」が設定されているので、(関数内に関しては)その関数内の仮引数「gramNum」が優先されます(つまり、この関数内ではグローバル変数「gramNum」は「認識されない」と言う事です)。 結局、下記のように「round()」で呼び出した場合の関数内の状態が問題になります。 >関数を「function round(gramNum){~}」と定義したとします。 >関数を「round()」で呼び出すと実引数が定義されていません(つまり実引数は未定義となります)。 >その結果、定義側の「function round(gramNum){~}」の仮引数「gramNum」は「undefined」になります。 >例えば「round(null)」で呼び出せばエラーにならないはずです。

okweb12345
質問者

お礼

お返事ありがとうございます。 下記のようにnullを入れてみましたがやはりうまくいきません。 undefinedになってしまいます。

okweb12345
質問者

補足

結論としてはグローバルに宣言しないと関数内の同じ名前の変数にアクセスできないのではなく、実引数が空であるとundefinedになってしまうので、仮引数がうまくいかず、関数内の処理できなかったという事ですね。 グローバル変数を削除しても問題なくできました。

回答No.1

>round(); ↑この呼び出しが原因です。 引数に何も指定してないので、「function round(gramNum)」側の「gramNum」が未定義となるようです。 「0」でも「1」でも「null」でも、指定できるものなら何でも良いですから、引数に何か指定して下さい。 例. round(null);

okweb12345
質問者

お礼

var gramNum; function round() { } としたところなぜか今回はうまくいきました。 ただ関数の中に入れるとやはりうまくいきません、 関数スコープがあるので他の所からは参照が出来ないと考えてよいでしょうか? このような場合、引数を使って外に書かずに参照する方法があると聞いたのですが、そんな方法はあるのでしょうか?

okweb12345
質問者

補足

お見せしたソースですと varはブロックスコープがないので一つ上ではなく同じスコープにあることになるのでしょうか? そして場合も同じスコープの変数は参照できると考えてよいでしょうか?