変数宣言時にfile_length
に値を代入していないからではないでしょうか?
var file_length = 0;
とするべきです。
[加筆]に対し追記:
javascriptの場合、外側で宣言した変数は特に何も気にすることなくグローバル変数として使用できたはずです。
追記:
繰り返しになりますがpythonじゃあるまいし(pythonの場合はglobal
の明示が必要)ローカルスコープでグローバル変数が使えないなんて事は無いですよ?
サンプル
もしずっと0なのでしたら、そもそもelement.files.length
の値が0だったりしませんか?
ちなみに実行タイミング的にconsole.log(file_length);//ここのグローバル変数を加算していきたい!
における出力は0
が正しいです。
さらに追記:
ローカルで変化した変数をグローバルで参照したい
とのことですが、今回の処理の場合は全部グローバル変数で管理する方がいいと思いますよ?
関数内でvar
を使ってローカル変数を宣言された場合、関数を抜けた段階で値がリセットされてしまいますから、そもそもローカル変数に値を保存するということ自体がまず不可能です。
javascript
1var glbl;
2
3var lcl = function(n){
4 var val = 0;
5 // ↑ここで0を代入してしまっている時点で、、あっ、ふ〜ん(察し)という感じですが(^ ^;
6 // しかし入れないわけには行きません。
7 val += n;
8 console.log(val);
9
10 glbl = val; // 質問者様が行いたいと考えておられること
11}
12
13lcl(10); // 期待する値 : 10 実際 : 10
14console.log(glbl); // 期待する値 : 10 実際 : 10
15lcl(10); // 期待する値 : 20 実際 : 10
16console.log(glbl); // 期待する値 : 20 実際 : 10
17lcl(10); // 期待する値 : 30 実際 : 10
18console.log(glbl); // 期待する値 : 30 実際 : 10
ですから関数内でもグローバル変数のみを用いる、という方法のままでいいと思います。
その直後(グローバル変数に保存した直後)にelement.files.length
で得られた値を使って別な処理をしたいわけでも無い限り、使い捨てのローカル変数を用意するだけ無駄です。
どうしてもスコープを意識したいのであればオブジェクト指向の考え方を使い、インスタンスのプロパティに保存すれば意図した動作となるとは思いますが、今回の動作でそのような大掛かりなものは不要だと思われます。
html
1<button>btn</button> step : <input type="number" value="10" />
2<script>
3$(function(){
4 var glbl = 5;
5
6 var lcl = new (function(){
7 this.step = 10;
8 this.add = function(){
9 glbl += this.step;
10 alert(glbl);
11 };
12 })();
13
14 $("button").click(function(){lcl.add();});
15 $("input").on("change",function(e){
16 lcl.step = parseInt(e.target.value);
17 });
18});
19</script>
サンプル
上記サンプルでは足していく値(step)をオブジェクト内に保存しています。
私の方こそ質問をよく理解していないかもしれません。。もし欲しい答えでなければすみません。。m(_ _)m
ようやく質問者様のおっしゃりたいことがわかってきたような気がするので改めて追記させてください。
当然グローバルでは加算されていないため、0が出力されてしまいます。
違います。ローカルスコープにおいてすでに参照されている変数はグローバル変数ですから、change
イベントが行われたあとにはちゃんとグローバル変数であるfile_length
に新しい値が代入されています。
しかしながらconsole.log(file_length);//ここのグローバル変数を加算していきたい!
はそもそも**change
イベントが行われた後には実行されません**。
このコードが実行されるのは**change
イベントのリスナーをinput
要素に付与した直後のみ**ですから、0
が出力されるんです。先ほど「ちなみに」として発言したのはこれをさしてのことです。
決してグローバル変数の値が更新されないから0
が出力されるのではありません。
むしろ//console.log(file_length); ここじゃない!
が正しい変更後の値を示す場所です。ここで出力される値はグローバル変数のものです。ローカル変数ではありません。
証拠としてもう一つサンプルを挙げようと思います。
html
1<input type="text" /> <button>hogeの中身</button>
2<script>
3var hoge = '';
4
5$(function(){
6 $('input').on('change',function(e){
7 hoge = e.target.value;
8 console.log('ここじゃない!の場所 : ' + hoge);
9 })
10 console.log('ここのグローバル変数を加算していきたい!の場所 : ' + hoge);
11});
12
13$(function(){
14 $('button').click(function(){
15 console.log('ちゃんとグローバルに保存されている : ' + hoge);
16 });
17});
18</script>
サンプル
サンプルを試していただければわかると思いますがconsole.log(file_length);//ここのグローバル変数を加算していきたい!
に当たる場所は最初に一回実行されているだけです。
追記のために非常に長くなってしまいました。。すみません。。
不明点等あればまた返信ください。m(_ _)m
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/10 10:53 編集
2017/10/10 11:07
2017/10/10 11:15
2017/10/10 13:04
2017/10/10 15:40
2017/10/11 01:14
2017/10/11 04:51
2017/10/11 06:40 編集
2017/10/11 15:35 編集
2017/10/11 15:32