javascript無名関数から変数にアクセス

このQ&Aのポイント
  • 無名関数からグローバル変数にアクセスする方法を御存知の方お教えいただけたら幸いです
  • 無名関数内でalert(e.target.result);するとちゃんと結果が表示されるのでFileReaderの処理は成功している模様です
  • 期待する結果はアラートで「結果」が表示されることですが、実際にはアラートで空白が表示されています
回答を見る
  • ベストアンサー

javascript無名関数から変数にアクセス

お世話になります。 javascript初心者です。 無名関数からグローバル変数にアクセスしたいのですが 外で変数を宣言して、内でvar無しで代入してみたのですがうまくいきません どのようにすれば期待する結果になるのか、お忙しい中恐縮ですが 詳しい方お教えいただけないでしょうか //グローバル変数 var hoge; //dataTransfer処理省略 //html5のFileReader var reader = new FileReader(); reader.readAsDataURL(file); //ロードが完了したら無名関数にてhogeに結果を代入 reader.onloadend = function(e) {  hoge = e.target.result; }; alert(hoge); ■期待する結果 アラートで「結果」が表示される ■実際の結果 アラートで「」(空白)が表示される 無名関数内でalert(e.target.result);するとちゃんと結果が表示されるので FileReaderの処理は成功している模様です。 無名関数からグローバル変数にアクセスする方法を御存知の方 お教えいただけたら幸いです

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

  • ベストアンサー
  • think49
  • ベストアンサー率59% (285/482)
回答No.1

グローバル変数へのアクセスの仕方は間違っていません。 --- var hoge; (function () { hoge = '結果'; })(); alert(hoge); // 結果 --- reader.onloadend より先にグローバルコードの alert(hoge); が発動しているのではありませんか。 reader.onloadend の中でも alert('onloadend'); をして順番を確かめてみてはどうでしょう?

susan-styl
質問者

お礼

回答ありがとうございます! 仰るとおり 値が空になったのは、ロードが終わって関数が呼び出される前に、alertが発動されたのが原因でした onloadendより下に書いたコードは onloadendが完了した後に実行されるものだと勘違いしておりました 大変勉強になりました! 迅速かつ的確なご回答ありがとうございます!

関連するQ&A

  • JavaScriptで特定の変数に値が代入されるのを禁止する。

    JavaScriptで、既存の変数に値を代入し、その後の上書き(その変数への値の代入)を禁止するにはどのようにすればよいでしょうか。 <script type="text/javascript"><!-- var hoge = "hogeは初期化されてます"; hoge = "hogeは変更されました";//ここ以降での変更(代入)を禁止したい。 hoge = "hoge変更2回目"; alert(hoge); //--></script> というスクリプトを書いたときに、alert(hoge)で「hogeは変更されました」と表示させたいのです。 他の方法は駄目です。この方法だけでお願いします。 よろしくお願いします。

  • JavaScriptの変数について

    JavaScriptのソースで解らないところがあり、困っています。 ソースは下記の様なものなのですが、エラーが出ていません。 解らない点は2点有ります。 1. jにfalseを代入している箇所なのですが、セミコロンがないのは何故なのでしょうか? Chromeのデベロッパツール, FireFoxのFirebugで確かめてみたのですが、エラーとなっておらず、alertでfalseと表示されている状態です。 「j = !1」の箇所を即時関数の外に出すと、エラーとなります。 普通変数に代入する式の末尾はセミコロンをつけると思うのですが、 何故なのでしょうか? 2.また、jはvar j等のように変数の宣言をせずに使えているようなのですが、 普通即時関数内で宣言した変数のスコープは関数の外では使えないので、エラーとなると思うのですが、宣言せずに代入に使った変数はグローバル変数と解釈されるのでしょうか? どなたかお答え下さい。 --------------------------------- <script> (function() { j = !1 })(); alert(j); </script>

  • 無名関数を使うメリットは何ですか?

    Javascriptに限らず、多くのプログラム言語で無名関数が使えると思います。以下の2つの記述法は、挙動に違いは全くありませんよね? function func() { return "普通の関数です。"; } var func = function() { return "無名関数です。"; } なぜ無名関数を使うのか調べてみたところ、「最近Ajaxが流行ってきてライブラリを使う機会が増えてきた。それらを利用する際、関数の名前が重複して誤作動するのを防げる」という答えを見つけました。しかし試してみたところ var func = function() { return "無名関数1です。"; } var func = function() { return "無名関数2です。"; } alert(func()); のように名前が被った場合、従来と同じで後に書かれた関数が動作します。イベント駆動型関数を無名関数にするメリットは分かります。たとえば window.onload = function() { alert("ウィンドウの読み込みが完了しました。"); } と書けば、他の関数との衝突によってこの関数が動作しないことはありません(ライブラリを使ってwindow.onloadが重複してしまったら別問題ですが)。 結局のところ、無名関数を使うメリットは何なのでしょうか?

  • 複数の無名関数を合成したい

    javascriptにおいて、無名関数を合成する方法を知っている方はいらっしゃるでしょうか? var func1 = function(){     alert('func1'); } var func2 = function(){     alert('func2'); } この二つの関数を合成して、 var func3 = function(){     alert('func1');     alert('func2'); } という風に合成したいのです。 jQueryを利用して var func3 = $.extend(func1, $func2); と試しましたが、func3 == func1 となってしまうようです。 また、単純に、var func3 = func1 + func2; では、 func3 = function(){alert('func1');}function(){alert('func2');} と意味を成さないものになってしまいます。

  • 関数内での繰り返し処理の結果を配列で受け取りたい

    関数内でfor文で繰り返し処理を行い、 結果を配列として返すような関数を書きたいと思っています。 function hoge(){ var a = [1,2,3,4]; for (var i=0; i < a.length; i++){ a1 = "a" + i; var arr = new Array(); arr.push(a1); } return arr; } しかし、以下のように 関数hogeの結果を変数bで受け取ってみると、 配列の最後のデータしか表示されません。 var b = hoge(); alert(b); //a3のみが表示される a0, a1, a2, a3と表示されるようにするには、 どうしたらよいでしょうか。

  • JavaScriptで変数名を取得する方法

    var 変数名 = new 関数名(引数1,引数2・・・);とした場合 alert(変数名.○○)などで変数名を表示する○○はあるでしょうか? 現在は引数1に変数名をセットして、関数内のプロパティに保持して、 alert(変数名.id)で表示できるようにしています。 ただしこれでは手間がかかったり、間違いが起こります。 もしそうでない方法があればご教授下さい。

  • Javascriptグローバル変数の値引き継ぎ

    Javascriptで関数関係なしに処理した値を引き継ぎたいのですが 可能でしょうか? 例: test = 0; //引き継ぎたい変数 function hoge(){ //処理  a = function(){ //処理 test = 1;  } } hoge; alert(test); //「1」にしたい(関数内で処理した値を保持したい)

  • function()は無名関数?

    jqueryの$(function() は無名関数だと思いますが、redyが省略されているので、DOMを読み込み終わってから実行とも聞きます。 両方の意味があるのでしょうか? 一見ダダの無名関数に見えますがどのように区別するのでしょうか? 下記の部分もfunction()があるのですがこちらもまた無名関数のなのですか? ただ即時関数ではないので変数などに入れて、関数の呼び出しをしないといけないのにその記載がなくても実行されるのはなぜでしょうか? each(function() $(function() { $(".textbox").each(function(){ var labelText = $(this).val(); $(this).focus(function(){ if( $(this).val() == labelText ){ $(this).val(""); } }).blur(function(){ if( $(this).val() =="" ){ $(this).val(labelText); } }); }); }); 補足 $(".textbox").each(function(){ var labelText = $(this).val(); $(this).focus(function(){ if( $(this).val() == labelText ){ $(this).val(""); の部分は無名関数の中身、つまりこの関数が実行されるときの中身のことなのでしょうか? jqueryだと何となくこの書き方をしているのですがJSの基礎で考えるとそのようになりますよね?

  • javascriptで、下記のコードをFireFoxで実行した際にd(

    javascriptで、下記のコードをFireFoxで実行した際にd("input")の行でエラーが出てしまいます。 <script language="javascript"> var a=window.alert; alert(a); a("test"); var d=document.createElement; alert(d); d("input"); </script> なぜ、window.alert関数はa変数に代入して実行できるのに、document.createElementはd変数に代入しても実行できないのでしょうか。 d変数をalertすると[native code]とアラートされるので、関数を d に代入出来てはいそうなのですが。 ちなみにFireFox3.5.11で発生した現象です。

  • 即時関数でプライベート変数的になってる理由を教えて

    即時関数内で、プライベート変数的な動きになっている(?)コードがあるのですが、呼び出せない理由を教えてください ・呼び出せる例1 (function() {  hoge2 = 'ホゲ2'; })() console.log(hoge2); ・呼び出せる例2 (function() {  var hoge1 = {};  hoge2 = 'ホゲ2'; })() console.log(hoge2); ・呼び出せない例 (function() {  var hoge1 = {},hoge2 = 'ホゲ2'; })() console.log(hoge2); ■質問1 ・どうして呼び出せないのでしょうか? ・varでローカル宣言(?)してるhoge1オブジェクトに紐づいているから? ・つまり、hoge2オブジェクトを生成している場所が違う? ■質問2 ・呼び出せない状態の時、hoge2はプライベート変数になっているのでしょうか? ■質問3 ・そもそもどうして呼び出せるのでしょうか? ・即時関数は(名前もしくはスコープ)空間を作り閉じ込めるので~、という記述を、どこかで見かけたような気もするのですが…

専門家に質問してみよう