質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1316閲覧

ローカルスコープで格納した変数を参照する方法

pegy

総合スコア243

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2018/09/26 06:41

編集2018/09/30 22:50

php等で配列にるループで値を格納したい場合には以下のようなコードで対応しております。

php

1$hoge=[]; 2for($i;$i<count($ary);$i++){ 3$hoge[]=ary[$i];//pushed in local scope 4} 5var_dump($ary);//global scope 6

同じ要領で下記のようにJSでもcontent(Array)にeachのなかでpushして値を格納していきたいのですが
local scopeで格納された値はgrobal scopeでは出力されません。

html

1<!DOCTYPE html> 2<html lang="ja" dir="ltr"> 3 <head> 4 <meta charset="utf-8"> 5 <title>script</title> 6 <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> 7 <script type="text/javascript" src="xdomain.js"></script> 8 </head> 9 <body> 10 11 <script type="text/javascript"> 12  //Javascript変数定義 13  var content =new Array(); 14  $(document).ready(function(){ 15   $.ajax({ 16    url: 'https://www.xyz',// http://から始まるURLを指定 17    type: 'GET', 18    success: function(res) { 19   var content =new Array(); 20   $(res.responseText).find('.link').each(function(){ 21   content.push($(this).attr('href'));//ここです 22   }) 23     console.log(content);//local scopeのため出力される 24   } 25  }); 26 }); 27  console.log(content);//globalscopeのため出力されない 28 29 </script> 30 </body> 31</html>
  1. Javascriptとphpではスコープの考え方が異なるのでしょうか?要領としては、globalで配列型で変数を宣言、localで配列に複数の値をpush、改めてグローバルで配列の内容をpushという点で変わらないと思うのですが、javascriptとphpのスコープの違い等で検索しても具体的なものを探すことができなかったため、アドバイスを頂けますでしょうか?

  2. 上記のJavascriptのコードでphpと同様にglobalでもその配列型変数を利用するすべはあるのでしょうか?

初歩的な内容であれば誠に申し訳ございませんが
宜しくお願い申し上げます。

修正コードの加筆

html

1<!DOCTYPE html> 2<html lang="ja" dir="ltr"> 3 <head> 4 <meta charset="utf-8"> 5 <title>script</title> 6 <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> 7 <script type="text/javascript" src="xdomain.js"></script> 8 </head> 9 <body> 10 11<script type="text/javascript"> 12//Javascript変数定義 13 14$(document).ready(function(){ 15 var content =new Array(); 16  $.ajax({ 17   url: 'https://www.xyz',// http://から始まるURLを指定 18  type: 'GET', 19    success: function(res) { 20 $(res.responseText).find('.link').each(function(){ 21 content.push($(this).attr('href')); 22 }) 23 24   // console.log(content); 25   } 26  }); 27   28  console.log(content); 29  }); 30 31  </script> 32 </body> 33</html>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

x_x

2018/09/26 08:24

res.responseTextにはどんな文字列が入ってくるのでしょうか?
pegy

2018/09/26 11:36

コメント有難うございます。30文字程度のURLになります。
guest

回答2

0

ベストアンサー

2点。

1点目。
var とつけると定義を意味するのでその時点でのスコープとなります。
提示のコードではグローバルスコープで定義したものの、success内にまたvarで定義されています。
success内で定義されたのでそのcontent という変数のスコープはsuccess内のみです。
他でもそのcontent という変数を使いたい(グローバルとしたい)のであればsuccess内の変数にvarは不要でしょう。

2点目。
ajaxのasyncが何も指定されていないので非同期処理ですね。
非同期処理ということはそのajaxの処理が終わっているかどうかに関わらずその後の処理は実行されていっています。
つまり、例えsuccess内でのvarを除いてグローバルとなっているcontentという変数にeachでもなんでも値を設定していっているとしても、一番最後のconsole.log()時点ではajaxのsuccess内の処理を待つことなく実行されている可能性が高いです。

投稿2018/09/26 07:34

m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pegy

2018/09/26 08:21

コメント有難うございます。 恐らく非同期処理が原因と思い、async: falseを指定したのですが、修正後のコード出力されなかったです。。。恐らく原因はご指摘の箇所かと思いますので、 非同期処理の完了を待って次の処理を実行する方法をもっと探ってみようと思います。
m.ts10806

2018/09/26 08:30

いずれにしてもコールバックから入っているので実行の順序は保証されません。そのときの通信状況などによって容赦なく前後するものと思われます。 修正後のコードもですが、インデントが結構めちゃくちゃで読みづらいので、 きちんとつけられたほうが良いです。
pegy

2018/09/30 22:46

mts10806様 不明瞭な完結で申し訳ございませんでした。 配列に格納されるべき値は完全性が保たれている必要があるため、通信の状況次第で、その後の処理が適切にされる場合とされない場合があるという状況は致命的でした。setTimeout等でその後の処理を遅らせる方法をとったとしても、なんら完全な処理に保証を与えるものではないため、call back内で次の処理を連続させるか他の方法を検討中でございます。 ただしながら、重大な欠陥と原因がわかり、他のアプローチをここで重ねてお問い合わせするのは憚られたため、一旦ベストアンサーをつけさせていただきましたが、お詫び申し上げます。
m.ts10806

2018/09/30 22:59

コメントありがとうございます。解決につながったようで何よりです。
guest

0

本件はスコープの問題ではなく、実行タイミングの問題ではないでしょうか?
jsのglobalscopeのため出力されないと書かれているところですが、ココの実行タイミングについて確認をして下さい。
$(document).ready(function()よりも先に実行されていませんか?
ready()はDOMの読み込みタイミングによって発火するものです。
ready()の中身の実行後に出力しようとするなら、どのタイミングでどうすれば出来るかをみてはどうでしょうか。

js

1//Javascript変数定義 2var content =new Array(); 3 $(document).ready(function(){ 4 $.ajax({ 5 url: 'https://www.xyz',// http://から始まるURLを指定 6 type: 'GET', 7 success: function(res) { 8 var content =new Array(); 9 $(res.responseText).find('.link').each(function(){ 10 content.push($(this).attr('href'));//ここです 11 }) 12 13 console.log(content);//local scopeのため出力される 14 } 15 }); 16 }); 17 18// ↓の実行タイミングは果たしてどこでしょうか 19console.log(content);//globalscopeのため出力されない

投稿2018/09/26 06:56

mikan_s4n

総合スコア377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pegy

2018/09/26 08:17

コメント有難うございます。 varでの変数宣言のタイミングとconsole.log()の出力場所が適切ではなかったため、ご指摘の箇所はコードを修正をいたしました。修正後のコードでも値が配列に格納されていないことがわかったのですが、 mts10806様からのご指摘があったとおり非同期処理が完了する前に実行されている可能性があるのではと現在確認しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問