iQuery やいくつかのライブラリを使用しています。

外部でグローバル変数を定義して、ある関数内でそのグローバル変数に値を設定すると、関数を抜けた時に変数値が保持されている場合と undefined になる場合があります。

どのような関数では保持されて、どのような関数では保持されないのか、よくわかりません。

保持されない関数において、関数内で得た値を外部に反映させたい場合はどのようにすれば良いのでしょうか。

A 回答 (2件)

No.1 の補足を見る限り、コールバックが非同期に


呼ばれているみたいですね。グローバル変数の問題ではなく、
処理の順序の問題です。

まず、APIが同期なのか非同期なのかチェックしてみて
ください。おそらく alert のほうが先に動いています。

もし APIが非同期なら、コールバックの起動を契機に
後の処理を行うように処理をかかないとダメだと思います。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。

ご指摘の通りでした。

api のスペックを詳しく読んでみたら asynchronously と書かれており、少し時間を置いてみたら正しく取得できました。

所望の動きのためにはどうコーディングすれば良いのかはまだわかっていませんが、数日悩んでいた問題の原因がようやく判明しました。

どうもありがとうございました。

お礼日時:2011/04/27 21:45

そうゆうことは無いはずですが、


どのように確認されていますか?

この回答への補足

早々のリプライありがとうございます。

具体的には位置情報を得る geolocation なのですが、

var lat;
var lng;
navigator.geolocation.getCurrentPosition(function(pos) {
 lat = pos.coords.latitude;
 lng = pos.coords.longitude;
 });
alert(lat + ':' + lng);

とかやると undefined になってしまいます。

もちろん関数内では値は取得できています。

補足日時:2011/04/27 18:06
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QgetElementByIdを使用したグローバル変数の定義(使い方について) 

グローバル変数の定義について教えてください。
getElementByIdを、グローバル変数で使用することはできないのでしょうか?

【グローバル変数(整数)】の場合
-------------------------------------------------
//グローバルで整数を定義
var a = 10;

function test(){
alert(a.value);
}

結果:「10」が表示される。
-------------------------------------------------



【グローバル変数(getElementByIdを使用)の場合】
-------------------------------------------------
//グローバルでgetElementByIdで取得したオブジェクトを定義
var a = document.getElementById("objname");

function test(){
alert(a.value);
}

結果:「null」 が表示される。
※a = document.getElementById("objname"); でも同様。
-------------------------------------------------


【ローカル変数(getElementByIdを使用)の場合】
-------------------------------------------------
function test(){
//ローカルでgetElementByIdで取得したオブジェクトを定義
var a = document.getElementById("objname");
alert(a.value);
}

結果:「画面入力値」 が表示される。
-------------------------------------------------


このように
getElementByIdで取得したオブジェクトを、
グローバル変数として扱った場合、nullとなるので困っています。

getElementByIdで取得したオブジェクトを、
グローバル変数として扱う良い方法はないでしょうか?


【環境】
OS:WindowsXP Pro
使用JavaScript:外部ファイルのjavaScript

グローバル変数の定義について教えてください。
getElementByIdを、グローバル変数で使用することはできないのでしょうか?

【グローバル変数(整数)】の場合
-------------------------------------------------
//グローバルで整数を定義
var a = 10;

function test(){
alert(a.value);
}

結果:「10」が表示される。
-------------------------------------------------



【グローバル変数(getElementByIdを使用)の場合】
-------------------------------------------------
//...続きを読む

Aベストアンサー

受取変数がグローバルかどうかが問題では無くて、getElementById の実行が早すぎるのが原因でうまくいかないのは無いでしょうか。 つまり、その ID のタグがまだ誕生していないタイミングで getElementById を発行しても null で当然という訳です。

例えば、以下にすればどうでしょう?

【グローバル変数(getElementByIdを使用)の場合】
-------------------------------------------------
// グローバル変数の定義
var a;

function onLoad() { // BODYタグの onload で実行される関数
//グローバル変数に getElementById で取得したオブジェクトを代入
a = document.getElementById("objname");
}

function test(){
alert(a.value);
}

Q関数内のグローバル変数の参照について

はじめまして。
質問があります。
まずは以下のコードを見てください。
----------------------------------------------------------------
<html>
<head>
<title>関数内のグローバル変数について</title>

<script type="text/javascript">
<!--
function func1()
{
a = "あああ";
}
//-->
</script>

</head>
<body>

<script type="text/javascript">
<!--
func1(); // ---(1)
document.write("a="+a+"<br>"); // ---(2)

//-->
</script>

</body>
</html>
----------------------------------------------------------------
上記の(1)と(2)について、上記の順番で記述すると、文字列がブラウザに
出力されるのですが、(1)と(2)の記述順を入れ替えるとIE6.0もNetscape
7.1も「aは宣言されていません。」という内容のエラーが発生して
ブラウザに文字列が表示されません。なぜこのようなエラーが発生する
のでしょうか?ご教授お願いします。

はじめまして。
質問があります。
まずは以下のコードを見てください。
----------------------------------------------------------------
<html>
<head>
<title>関数内のグローバル変数について</title>

<script type="text/javascript">
<!--
function func1()
{
a = "あああ";
}
//-->
</script>

</head>
<body>

<script type="text/javascript">
<!--
func1(); // ---(1)
document.write("a="+a+"<br>"); // ---(2)

//-->
</script>

</bo...続きを読む

Aベストアンサー

上から、とは記述されている物の事。scriptだけでなくHTMLをも含む
↑のサンプルの場合

html開始タグ 読まれる
head開始タグ 読まれる
title開始タグ読まれる タイトル文字列読まれる タイトル終了タグ読まれる title確定
script開始タグ読まれる
script記述読まれる
function func1() 読まれる (正しく閉じているので定義確定。タグ閉じてないけどこの段階でfunc1が有効になるのがミソ。ただしfunctionなので呼ばれなければ「実行されない」)
script終了タグ読まれる (これが正しくないと以降のタグが死ぬ)
head終了タグ読まれる head内定義確定
body開始タグ読まれる
script開始タグ読まれる
func1呼ばれる a="あああ"
document.write実行される
script終了タグ読まれる
body終了タグ読まれる
html終了タグ読まれる
ファイル終端。描画END



見ての通りfunc1が呼ばれるまで a の内容は不定。
人が見ると確かにaに代入してるように見えるが件のようにfunc1呼出しとdocument.writeが入れ替わるとaが不定のまま実行される。
javascriptはページが読み込まれる時には値が初期化状態なのでaは不定ではなく未宣言となる。
よって件の入れ替えを行うと未宣言のまま呼び出す事になる。

定義 と 実行 を勘違いしないように。
定義は定義しかしない。そこに現れても何もしない
エラーを防ぎたいならfuncの定義外にaの初期化を記述すれば良い

a = "";
funcgion func(){
/*--
--*/
}

上から、とは記述されている物の事。scriptだけでなくHTMLをも含む
↑のサンプルの場合

html開始タグ 読まれる
head開始タグ 読まれる
title開始タグ読まれる タイトル文字列読まれる タイトル終了タグ読まれる title確定
script開始タグ読まれる
script記述読まれる
function func1() 読まれる (正しく閉じているので定義確定。タグ閉じてないけどこの段階でfunc1が有効になるのがミソ。ただしfunctionなので呼ばれなければ「実行されない」)
script終了タグ読まれる (これが正しくないと以降の...続きを読む

QC言語のグローバル変数の初期化について

C言語において
int a = 1; // 動的グローバル変数
static int b = 2; //静的グローバル変数

funcA(){
int c = 3; // 動的ローカル変数
static int d = 4; //静的グローバル変数



}
上記のように各種変数を初期化したとします。
"c"のような動的ローカル変数であれば、funcA()が呼ばれたときに毎回初期化されますよね?

では
・"d"のような静的ローカル変数は、初めてfuncA()が呼ばれたときに初期化されるのですか?
・"a","b"のyほうなグローバル変数は、どのタイミングで初期化されるのですか?

以上2点について伺いたいと思います。

ちなみに、組み込み機器むけのソフトウェアを想定しています。

Aベストアンサー

No.11 = Interest です。

> コンパイル時に"a","b","d"の領域が.dataセクションに確保される。

コンパイル時ではなく、リンク時です。リンク前は、これらのデータがどこに配置されるかまだ決まっていません。

> コンパイル時にスタートアップルーチンが自動生成され(?)

これ、違います。
スタートアップルーチンが自動生成されるとすれば、統合開発環境などを使ってプロジェクトを生成したときです。統合開発環境を使ってなければ、スタートアップルーチンを手で書くこともあります。(どこかからコピーしてくるほうが楽ですが。)コンパイル時に自動生成されるものではありません。


> main関数実行前に、

これは間違いではありませんが、注意が必要です。
CPUに電源が供給されて一番最初に走り始めるプログラムがスタートアップルーチンです。スタートアップルーチンが「いわゆるmain関数」を呼び出します。すでにご存じと思いますが、組み込みの世界では必ずしも main関数があるわけではないので、「main関数実行前に」という考えかたは適切ではありません。

> スタートアップルーチンが変数をROM→RAMへとコピーする際に、.dataセクションの変数を初期化する。(.bssセクションは0初期化する)

「変数をROM→RAMへとコピーする」ことと、「.dataセクションの変数を初期化する」ことは同じことです。言い換えれば「.dataセクションの変数を初期化するために、ROMに格納されている初期値をRAMへとコピーする」ってこと。

No.11 = Interest です。

> コンパイル時に"a","b","d"の領域が.dataセクションに確保される。

コンパイル時ではなく、リンク時です。リンク前は、これらのデータがどこに配置されるかまだ決まっていません。

> コンパイル時にスタートアップルーチンが自動生成され(?)

これ、違います。
スタートアップルーチンが自動生成されるとすれば、統合開発環境などを使ってプロジェクトを生成したときです。統合開発環境を使ってなければ、スタートアップルーチンを手で書くこともあります。(どこかから...続きを読む

Qjqueryのグローバル変数とローカル変数

知識のある方に教えて頂きたいことがございます。
jqueryを何気なく組んでいたもので、基礎的なことがわかっておらず
ご教示頂きたいのですが、
下記に記述した変数の(1)~(6)をどれが
グローバル変数で、どれがローカル変数なのかご教示いただけますでしょうか。
関数の中は全てローカル変数になるという事を聞いたので、(3)と(4)はローカル変数、
プラグイン自体関数なので、(5)と(6)はローカル変数
(1)と(2)はグローバル変数だと考えておりますが、あっていますでしょうか。
どうかよろしくお願い致します。

$(function(){

var a = 0;//(1)
b = 0;//(2)

function Kansu(){
var c = 0;//(3)
a = 1;//(4)
}
})

/* ----------------------------------------- */

(function($){

$.fn.testPlugin = function(options){
var d = 0;//(5)
e = 0;//(6)
}

});

知識のある方に教えて頂きたいことがございます。
jqueryを何気なく組んでいたもので、基礎的なことがわかっておらず
ご教示頂きたいのですが、
下記に記述した変数の(1)~(6)をどれが
グローバル変数で、どれがローカル変数なのかご教示いただけますでしょうか。
関数の中は全てローカル変数になるという事を聞いたので、(3)と(4)はローカル変数、
プラグイン自体関数なので、(5)と(6)はローカル変数
(1)と(2)はグローバル変数だと考えておりますが、あっていますでしょうか。
どうかよろしくお願い致します。

$...続きを読む

Aベストアンサー

ローカル変数:(1), (3), (5)
グローバル変数:(2), (4), (6)

> 関数の中は全てローカル変数になる
のはあいにくながら JavaScript 以外の言語の話です。
JavaScript の場合は、以下の場合のみローカル変数となります。
(1)以下の二つをどちらも満たす。
 (a) 何らかの関数の中で定義されている。
 (b) var キーワードを付加して定義されている。
(2)関数の宣言時の引数。

あなたが番号を付けた変数は(2)ではありませんが、いずれも(1)-(a)を満たします。
したがって、(1)-(b)で言う var の有無でグローバルか否かが決まります。

……「でも (1) と (2) は関数の外にありますよね」と思われましたか?
1 行目に function(){ という記述があって、その鍵括弧が閉じる前に (1) と (2) が定義されてます。つまりこれらはその一番大外の関数の中で定義されています。したがってこれらも(1)-(a)を十分満たしています。

参考URL:http://builder.japan.zdnet.com/script/sp_javascript-kickstart-2007/20373861/

ローカル変数:(1), (3), (5)
グローバル変数:(2), (4), (6)

> 関数の中は全てローカル変数になる
のはあいにくながら JavaScript 以外の言語の話です。
JavaScript の場合は、以下の場合のみローカル変数となります。
(1)以下の二つをどちらも満たす。
 (a) 何らかの関数の中で定義されている。
 (b) var キーワードを付加して定義されている。
(2)関数の宣言時の引数。

あなたが番号を付けた変数は(2)ではありませんが、いずれも(1)-(a)を満たします。
したがって、(1)-(b)で言う var の有...続きを読む

Qグローバル変数はDLLの中で使えますか?

DLL化する関数の中でグローバル変数を使っているのですが、
DLLの関数の中でもグローバル変数を使えますか?
やっぱり、引数として渡すしかないでしょうか?

Delphi XE5 starter を使っています。

Aベストアンサー

>DLL化する関数の中でグローバル変数を使っているのですが、
>DLLの関数の中でもグローバル変数を使えますか?

DLL内ではグローバル変数は使えません。

DLLは、リエントラント(スレッドセーフ)にすべきです。

>やっぱり、引数として渡すしかないでしょうか?

そうなるでしょうけど、不正な引数を渡された時にエラーで弾く仕組みが必要だと思います。

例えば、構造体のポインタを渡す方式にして、構造体の先頭のメンバーに「構造体のサイズ」を予めセットしておかないと呼び出し時にエラーにする、など。

こうすると、バージョンアップで「構造体メンバーが増えた時」に、先頭のメンバーに入っている「構造体のサイズ」をDLL側で検査する事で「旧方式で呼び出した」か「新方式で呼び出した」かを判定して処理を振り分けできます。

Qグローバル変数とローカル変数について

今JavaScriptを勉強している初心者です。
実は、ある本に書かれているソースコードでグローバル変数とローカル変数の違いがよく分からなくなりましてここに質問させて頂く次第です。
まずは、ソースコードを書きます。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta http-equiv="Content-type" content="text/html; charset=UTF-8">
<title>変数のスコープ</title>
<script type="text/javascript">
function testFunc(){
var num;
num=5;
}
</script>
</head>

<body bgcolor="#FFFFFF">
<p style="font-size:200%">
<script type="text/javascript">
var num=3;
testFunc();
document.write(num, "<br>")
</script>
</p>
</body>
</html>

このままだとブラウザに表示されるのはグローバル変数「3」になるというのも今一分からないのですが。
この次に<head>部分の
var num;
をコメントにします。
すると、何故かローカル変数「5」がグローバル変数になり、<body>部分のtestFunc()メソッドの結果ブラウザに表示される値が「5」になるというものです。
var num;
をコメントとする事はnumは変数宣言されていないことになります。
なのに
num = 5;
が成り立つのもよく分かりません。

そこでアドバイスを頂きたくここに書き込む事にしました。
是非とも宜しくお願い致します。

今JavaScriptを勉強している初心者です。
実は、ある本に書かれているソースコードでグローバル変数とローカル変数の違いがよく分からなくなりましてここに質問させて頂く次第です。
まずは、ソースコードを書きます。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta http-equiv="Content-type" content="text/html; charset=UTF-8">
<title>変数のスコープ...続きを読む

Aベストアンサー

実を言うと、その本の書き方は script 要素を別にしているため、HTML の読み込み順序規則も絡んで少々ややこしいことになっています。

純粋に JavaScript の規則だけで考えられるよう、素直にスクリプトコードを 1 個にまとめてしまいましょう。

var num = 3;
testFunc();
document.write(num, "<br>")

function testFunc(){
 var num;
 num = 5;
}

さて、JavaScript コードは単純に「上から下へ」実行されるわけではありません。まず、グローバルの位置にある var 宣言と function 宣言を全て拾い集めます。ここでは次の 2 個が見つかります。

// 宣言の処理
var num;
function testFunc();

その後、グローバルコードを「上から下へ」実行していきます。

// 実行ステップ
num = 3;
testFunc();
document.write(num, "<br>")

つまり、実行ステップに入る前に、var 宣言と function 宣言は変数と関数を作ってしまうのです。ただし、この段階では入れ物を作ったに過ぎず、実際に何を入れるかは実行ステップに入ってから決まります。var num = 3; とは、変数宣言である var num; と、実行ステップの num = 3; を一緒に書いたものにすぎません。私が冒頭でわざと function testFunc() を下に持って来た理由もお分かりでしょう。ソースコードの中で function 宣言を後ろに書いても、何の問題もないのです。

さて、このグローバルコードは実行ステップで関数 testFunc を呼び出しています。すると、実行ステップは一時中断され、testFunc に記述された関数コードが、やはり同じ手順で処理されます。まず、関数コード内の var 宣言と function 宣言を拾い集めます(仮引数も var 宣言と見なされます)。

// 宣言の処理
var num;

// 実行ステップ
num = 5;

実行ステップに入り、変数 num をセットしようとすると、グローバルの num が見つかる前に、関数内の num が見つかります。なので、書き変わるのは関数内の num だけです。

関数コードの実行ステップが終わると、グローバルコードの実行ステップに戻ります。document.write(num); で使われる num はグローバルで宣言された num であり、この場合は初期化された 3 のままです。

----
こうして、グローバルコードの変数・関数宣言 → グローバルコードの実行 → 関数呼び出しによるグローバルコードの一時中断 → 関数コードの変数・関数宣言 → 関数コードの実行 → グローバルコードの再開、のようになります。

関数コードは関数が呼び出されるたびに処理されます。つまり、関数を呼び出すたびにローカル変数が作られているのです。var 宣言が処理されるタイミングを念頭に置きつつ、ソースコードとにらめっこして下さい。

----
もし、関数 testFunc 内の var num; を削除した場合はどうなるか。関数コードは次のように処理されます。

// 宣言の処理
// 何もなし

// 実行ステップ
num = 5;

実行ステップに入り、変数 num をセットしようとすると、グローバルの num しか見つかりません。なので、グローバル変数の num が書き換えられます。

関数コードの実行ステップが終わり、グローバルコードの実行ステップに戻って document.write(num); を呼び出します。このときの num はグローバル変数ですが、上のステップで書き換えられて 5 になっています。

----
そういうわけで、JavaScript ではスコープが極めて重要であり、原則として必ず var 宣言して下さい。スコープチェーンの応用のひとつに、いわゆるクロージャと呼ばれるものがありますが、この辺りをすっ飛ばしていると理解しにくいと思います。

実を言うと、その本の書き方は script 要素を別にしているため、HTML の読み込み順序規則も絡んで少々ややこしいことになっています。

純粋に JavaScript の規則だけで考えられるよう、素直にスクリプトコードを 1 個にまとめてしまいましょう。

var num = 3;
testFunc();
document.write(num, "<br>")

function testFunc(){
 var num;
 num = 5;
}

さて、JavaScript コードは単純に「上から下へ」実行されるわけではありません。まず、グローバルの位置にある var 宣言と function 宣言を全て拾い集めます...続きを読む

Qグローバル変数について (C言語)

C言語でグローバル変数についての質問です。
変数のスコープはなるべく狭いほうがいいと言われたのですが、これはなぜでしょうか?ローカル変数よりもグローバル変数のほうが実行速度が遅くなったりするのでしょうか?
回答よろしくお願いします。

Aベストアンサー

グローバル変数に何が入っているかは、プログラムを読み始めて最後まで読み終わるまでずっと覚えておかなくてはなりません。
ローカル変数だと、関数の最初から最後まで覚えておけば大丈夫。

同じ意味で、宣言するのが面倒だからと全然違う目的に使い回すのも良くない。

速度はケースバイケースですが、実感できるほどの差には普通なりません。

Q無名関数内の変数のreturn

httpObj.onreadystatechange = function() {
if ((httpObj.readyState == 4) && (httpObj.status == 200)) {
var data = httpObj.responseText.split(",");

Ajaxで非同期通信をしています。
ステータスチェックをして、respinseTextを受け取るのですが、この変数dataをどうしてもreturnしたいのです。
このままだと、当然ローカル変数なのでreturnできません。

前に同じ質問をして、同期通信にすればよいのでは?とアドバイスをいただいたのですが、今回はどうしても非同期通信を行いたいのです。
変数varをそのまま別の関数の引数にする、という方法では解決できずに困っております。
何かよい方法があれば、アドバイスをお願いします。

Aベストアンサー

基本的に考えれば、ココで呼び出されている無名関数は、イベントで呼び出されているので、たとえreturn したとしても、その返値を利用できません。
なので、こういう場合は、コールバックという手法を試されたらどうでしょう。
例えば、今呼び出している関数がreceiveData() だとしたら
data = receiveData();
のようにしたいワケですよね。
このdata を受け取って処理するコードを
function procDATA(data){
//data を実際に処理するコード
}
の様に関数にして
receiveData(procData);
のようにして
function receiveData(func){
//受信のコード
}
とすれば、
データの受信が終了した段階で
func(data);
と無名関数の中から呼び出せば処理関数にdata を渡すことができます。

Q配列をグローバル変数にとってやりたい

 今晩は、Cの初心者です宜しくお願いします。

 今、ポインターを使わないでグローバル変数でサブルーチンから配列が使えるのかの勉強をしているのですが、
Cでは、配列をグローバル変数にとってやることは出来ないのでしょうか。
 どうも正常にプログラムが実行出来ないのですが。

 宜しくお願いします。

Aベストアンサー

>Cでは、配列をグローバル変数にとってやることは出来ないのでしょうか。
できます。

>どうも正常にプログラムが実行出来ないのですが。
その正常に動作しないソースを開示してください。

Q無名関数内の変数のreturn

function get_record(id,step,exefunc) {
httpObj = new XMLHttpRequest();
...XMLHttpRequest非同期通信
 httpObj.onreadystatechange = function() {
if(httpObj.readyState == 4) && (httpObj,status == 200) {
data = httpObj.responseText;
exefunc(data);
}}}
上記関数でデータを1件取得します。
質問は2つあって、今はhttpObj.responseTextをexefunc関数の引数として渡して、responseTextを処理しています。
httpObj.responseTextをexefunc関数で処理するのではなくて、returnしたいのですが、どうすればよいかわかりません。無名関数の中にあるので、dataをreturnしても、外からは参照できないのです。
もう一つの問題は、get_record関数を呼び出す関数は2つあって、その2つを同時にwindow.onloadで実行したいのです。
get_recordでデータを取得、そのデータを表示するための関数disp1,disp2(表示場所が違うため2つにわけています)をwindow.loadで実行したいのですが、後に記述されたほうしか実行されません。
どうすれば2つがwindow.onloadで実行できるでしょうか。
足りない情報等あれば教えてください。
よろしくお願いします。

function get_record(id,step,exefunc) {
httpObj = new XMLHttpRequest();
...XMLHttpRequest非同期通信
 httpObj.onreadystatechange = function() {
if(httpObj.readyState == 4) && (httpObj,status == 200) {
data = httpObj.responseText;
exefunc(data);
}}}
上記関数でデータを1件取得します。
質問は2つあって、今はhttpObj.responseTextをexefunc関数の引数として渡して、responseTextを処理しています。
httpObj.responseTextをexefunc関数で処理するのではなくて、returnしたいの...続きを読む

Aベストアンサー

自信無しですが、
同期型でsend すれば、イベント駆動を使わなくていいようになるんじゃないかな。
もう1つの問題も同じ。

http://jsgt.org/mt/archives/01/000409.html
http://jsgt.org/ajax/ref/lib/ref.htm
なんかのライブラリを使うと、
非同期でも上書しないようになっている
とあるので、参考になるかも。


人気Q&Aランキング