回答編集履歴

15

微妙な言い回しの修正

2017/10/10 15:57

投稿

namnium1125
namnium1125

スコア2043

test CHANGED
@@ -186,7 +186,7 @@
186
186
 
187
187
 
188
188
 
189
- このコードが実行されるのは**`change`イベントを`input`要素に付与した直後のみ**ですから、`0`が出力されるんです。先ほど「ちなみに」として発言したのはこれをさしてのことです。
189
+ このコードが実行されるのは**`change`イベントのリスナーを`input`要素に付与した直後のみ**ですから、`0`が出力されるんです。先ほど「ちなみに」として発言したのはこれをさしてのことです。
190
190
 
191
191
 
192
192
 

14

コード内の文言の変更

2017/10/10 15:57

投稿

namnium1125
namnium1125

スコア2043

test CHANGED
@@ -232,7 +232,7 @@
232
232
 
233
233
  $('button').click(function(){
234
234
 
235
- console.log('グローバルに保存されていないならば "" のはず : ' + hoge);
235
+ console.log('ちゃんとグローバルに保存されてい : ' + hoge);
236
236
 
237
237
  });
238
238
 
@@ -242,7 +242,7 @@
242
242
 
243
243
  ```
244
244
 
245
- [サンプル](https://jsfiddle.net/bof256qz/)
245
+ [サンプル](https://jsfiddle.net/mcLsarpy/)
246
246
 
247
247
 
248
248
 

13

追記

2017/10/10 15:46

投稿

namnium1125
namnium1125

スコア2043

test CHANGED
@@ -163,3 +163,95 @@
163
163
 
164
164
 
165
165
  私の方こそ質問をよく理解していないかもしれません。。もし欲しい答えでなければすみません。。m(_ _)m
166
+
167
+
168
+
169
+ ##
170
+
171
+
172
+
173
+ ようやく質問者様のおっしゃりたいことがわかってきたような気がするので改めて追記させてください。
174
+
175
+
176
+
177
+ > 当然グローバルでは加算されていないため、0が出力されてしまいます。
178
+
179
+
180
+
181
+ 違います。ローカルスコープにおいてすでに参照されている変数はグローバル変数ですから、**`change`イベントが行われたあとにはちゃんとグローバル変数である`file_length`に新しい値が代入されています。**
182
+
183
+
184
+
185
+ しかしながら`console.log(file_length);//ここのグローバル変数を加算していきたい!`はそもそも**`change`イベントが行われた後には実行されません**。
186
+
187
+
188
+
189
+ このコードが実行されるのは**`change`イベントを`input`要素に付与した直後のみ**ですから、`0`が出力されるんです。先ほど「ちなみに」として発言したのはこれをさしてのことです。
190
+
191
+
192
+
193
+ 決してグローバル変数の値が更新されないから`0`が出力されるのではありません。
194
+
195
+
196
+
197
+ むしろ`//console.log(file_length); ここじゃない!`が正しい変更後の値を示す場所です。ここで出力される値は**グローバル変数のものです**。ローカル変数ではありません。
198
+
199
+
200
+
201
+ 証拠としてもう一つサンプルを挙げようと思います。
202
+
203
+
204
+
205
+ ```html
206
+
207
+ <input type="text" /> <button>hogeの中身</button>
208
+
209
+ <script>
210
+
211
+ var hoge = '';
212
+
213
+
214
+
215
+ $(function(){
216
+
217
+ $('input').on('change',function(e){
218
+
219
+ hoge = e.target.value;
220
+
221
+ console.log('ここじゃない!の場所 : ' + hoge);
222
+
223
+ })
224
+
225
+ console.log('ここのグローバル変数を加算していきたい!の場所 : ' + hoge);
226
+
227
+ });
228
+
229
+
230
+
231
+ $(function(){
232
+
233
+ $('button').click(function(){
234
+
235
+ console.log('グローバルに保存されていないならば "" のはず : ' + hoge);
236
+
237
+ });
238
+
239
+ });
240
+
241
+ </script>
242
+
243
+ ```
244
+
245
+ [サンプル](https://jsfiddle.net/bof256qz/)
246
+
247
+
248
+
249
+ サンプルを試していただければわかると思いますが`console.log(file_length);//ここのグローバル変数を加算していきたい!`に当たる場所は最初に一回実行されているだけです。
250
+
251
+
252
+
253
+ 追記のために非常に長くなってしまいました。。すみません。。
254
+
255
+
256
+
257
+ 不明点等あればまた返信ください。m(_ _)m

12

コード等の編集

2017/10/10 15:40

投稿

namnium1125
namnium1125

スコア2043

test CHANGED
@@ -112,37 +112,41 @@
112
112
 
113
113
  ```html
114
114
 
115
- <button id="btn">btn</button> step : <input type="number" id="step" value="10"></input>
115
+ <button>btn</button> step : <input type="number" value="10" />
116
116
 
117
117
  <script>
118
118
 
119
+ $(function(){
120
+
119
- var glbl = 5;
121
+ var glbl = 5;
120
122
 
121
123
 
122
124
 
123
- var lcl = new (function(){
125
+ var lcl = new (function(){
124
126
 
125
- this.step = 10;
127
+ this.step = 10;
126
128
 
127
- this.add = function(){
129
+ this.add = function(){
128
130
 
129
- glbl += this.step;
131
+ glbl += this.step;
130
132
 
131
- alert(glbl);
133
+ alert(glbl);
132
134
 
133
- };
135
+ };
134
136
 
135
- })();
137
+ })();
136
138
 
137
139
 
138
140
 
139
- document.getElementById("btn").addEventListener("click",function(){lcl.add();},false);
141
+ $("button").click(function(){lcl.add();});
140
142
 
141
- document.getElementById("step").addEventListener("change",function(e){
143
+ $("input").on("change",function(e){
142
144
 
143
- lcl.step = parseInt(e.target.value);
145
+ lcl.step = parseInt(e.target.value);
144
146
 
145
- },false);
147
+ });
148
+
149
+ });
146
150
 
147
151
  </script>
148
152
 
@@ -150,7 +154,7 @@
150
154
 
151
155
 
152
156
 
153
- [サンプル](https://jsfiddle.net/vnghakx5/)
157
+ [サンプル](https://jsfiddle.net/L683bkj5/)
154
158
 
155
159
 
156
160
 

11

語弊回避のため編集

2017/10/10 14:34

投稿

namnium1125
namnium1125

スコア2043

test CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
 
24
24
 
25
- 繰り返しになりますがpythonじゃあるまいしローカルスコープでグローバル変数が使えないなんて事は無いですよ?
25
+ 繰り返しになりますがpythonじゃあるまいし(pythonの場合は`global`の明示が必要)ローカルスコープでグローバル変数が使えないなんて事は無いですよ?
26
26
 
27
27
 
28
28
 

10

太字範囲の修正。なんどもすみません。。

2017/10/10 14:23

投稿

namnium1125
namnium1125

スコア2043

test CHANGED
@@ -52,7 +52,7 @@
52
52
 
53
53
 
54
54
 
55
- 関数内で`var`を使ってローカル変数を宣言された場合、**関数を抜けた段階で値がリセット**されてしまいますから、そもそも**ローカル変数に値を保存する**ということ自体がまず不可能です。
55
+ 関数内で`var`を使ってローカル変数を宣言された場合、**関数を抜けた段階で値がリセット**されてしまいますから、そもそも**ローカル変数に値を保存するということ自体がまず不可能**です。
56
56
 
57
57
 
58
58
 

9

文言の追加

2017/10/10 14:13

投稿

namnium1125
namnium1125

スコア2043

test CHANGED
@@ -98,7 +98,11 @@
98
98
 
99
99
 
100
100
 
101
- ですから関数内でもグローバル変数のみを用いる、という方法のままでいいと思います。使い捨てのローカル変数を用意するだけ無駄です。
101
+ ですから関数内でもグローバル変数のみを用いる、という方法のままでいいと思います。
102
+
103
+
104
+
105
+ その直後(グローバル変数に保存した直後)に`element.files.length`で得られた値を使って別な処理をしたいわけでも無い限り、使い捨てのローカル変数を用意するだけ無駄です。
102
106
 
103
107
 
104
108
 

8

コードの追加

2017/10/10 14:12

投稿

namnium1125
namnium1125

スコア2043

test CHANGED
@@ -106,7 +106,47 @@
106
106
 
107
107
 
108
108
 
109
+ ```html
110
+
111
+ <button id="btn">btn</button> step : <input type="number" id="step" value="10"></input>
112
+
113
+ <script>
114
+
115
+ var glbl = 5;
116
+
117
+
118
+
119
+ var lcl = new (function(){
120
+
121
+ this.step = 10;
122
+
123
+ this.add = function(){
124
+
125
+ glbl += this.step;
126
+
127
+ alert(glbl);
128
+
129
+ };
130
+
131
+ })();
132
+
133
+
134
+
135
+ document.getElementById("btn").addEventListener("click",function(){lcl.add();},false);
136
+
137
+ document.getElementById("step").addEventListener("change",function(e){
138
+
139
+ lcl.step = parseInt(e.target.value);
140
+
141
+ },false);
142
+
143
+ </script>
144
+
145
+ ```
146
+
147
+
148
+
109
- [オブジェクト指向のサンプル](https://jsfiddle.net/vnghakx5/)
149
+ [サンプル](https://jsfiddle.net/vnghakx5/)
110
150
 
111
151
 
112
152
 

7

コメントアウトの追加

2017/10/10 13:30

投稿

namnium1125
namnium1125

スコア2043

test CHANGED
@@ -66,6 +66,10 @@
66
66
 
67
67
  var val = 0;
68
68
 
69
+  // ↑ここで0を代入してしまっている時点で、、あっ、ふ〜ん(察し)という感じですが(^ ^;
70
+
71
+  // しかし入れないわけには行きません。
72
+
69
73
  val += n;
70
74
 
71
75
  console.log(val);

6

文言の追加

2017/10/10 13:20

投稿

namnium1125
namnium1125

スコア2043

test CHANGED
@@ -94,6 +94,10 @@
94
94
 
95
95
 
96
96
 
97
+ ですから関数内でもグローバル変数のみを用いる、という方法のままでいいと思います。使い捨てのローカル変数を用意するだけ無駄です。
98
+
99
+
100
+
97
101
  どうしてもスコープを意識したいのであればオブジェクト指向の考え方を使い、インスタンスのプロパティに保存すれば意図した動作となるとは思いますが、今回の動作でそのような大掛かりなものは不要だと思われます。
98
102
 
99
103
 
@@ -103,3 +107,7 @@
103
107
 
104
108
 
105
109
  上記サンプルでは足していく値(step)をオブジェクト内に保存しています。
110
+
111
+
112
+
113
+ 私の方こそ質問をよく理解していないかもしれません。。もし欲しい答えでなければすみません。。m(_ _)m

5

文言の編集

2017/10/10 13:16

投稿

namnium1125
namnium1125

スコア2043

test CHANGED
@@ -52,7 +52,7 @@
52
52
 
53
53
 
54
54
 
55
- 関数内で`var`を使って宣言された場合、**関数を抜けた段階で値がリセット**されてしまいますから、そもそも**ローカル変数に値を保存する**ということ自体がまず不可能です。
55
+ 関数内で`var`を使ってローカル変数を宣言された場合、**関数を抜けた段階で値がリセット**されてしまいますから、そもそも**ローカル変数に値を保存する**ということ自体がまず不可能です。
56
56
 
57
57
 
58
58
 

4

追記

2017/10/10 13:05

投稿

namnium1125
namnium1125

スコア2043

test CHANGED
@@ -35,3 +35,71 @@
35
35
 
36
36
 
37
37
  ちなみに実行タイミング的に`console.log(file_length);//ここのグローバル変数を加算していきたい!`における出力は`0`が正しいです。
38
+
39
+
40
+
41
+ ##
42
+
43
+ さらに追記:
44
+
45
+
46
+
47
+ > ローカルで変化した変数をグローバルで参照したい
48
+
49
+
50
+
51
+ とのことですが、今回の処理の場合は全部グローバル変数で管理する方がいいと思いますよ?
52
+
53
+
54
+
55
+ 関数内で`var`を使って宣言された場合、**関数を抜けた段階で値がリセット**されてしまいますから、そもそも**ローカル変数に値を保存する**ということ自体がまず不可能です。
56
+
57
+
58
+
59
+ ```javascript
60
+
61
+ var glbl;
62
+
63
+
64
+
65
+ var lcl = function(n){
66
+
67
+ var val = 0;
68
+
69
+ val += n;
70
+
71
+ console.log(val);
72
+
73
+
74
+
75
+ glbl = val; // 質問者様が行いたいと考えておられること
76
+
77
+ }
78
+
79
+
80
+
81
+ lcl(10); // 期待する値 : 10 実際 : 10
82
+
83
+ console.log(glbl); // 期待する値 : 10 実際 : 10
84
+
85
+ lcl(10); // 期待する値 : 20 実際 : 10
86
+
87
+ console.log(glbl); // 期待する値 : 20 実際 : 10
88
+
89
+ lcl(10); // 期待する値 : 30 実際 : 10
90
+
91
+ console.log(glbl); // 期待する値 : 30 実際 : 10
92
+
93
+ ```
94
+
95
+
96
+
97
+ どうしてもスコープを意識したいのであればオブジェクト指向の考え方を使い、インスタンスのプロパティに保存すれば意図した動作となるとは思いますが、今回の動作でそのような大掛かりなものは不要だと思われます。
98
+
99
+
100
+
101
+ [オブジェクト指向のサンプル](https://jsfiddle.net/vnghakx5/)
102
+
103
+
104
+
105
+ 上記サンプルでは足していく値(step)をオブジェクト内に保存しています。

3

追記

2017/10/10 13:03

投稿

namnium1125
namnium1125

スコア2043

test CHANGED
@@ -13,3 +13,25 @@
13
13
 
14
14
 
15
15
  javascriptの場合、外側で宣言した変数は特に何も気にすることなくグローバル変数として使用できたはずです。
16
+
17
+
18
+
19
+ ##
20
+
21
+ 追記:
22
+
23
+
24
+
25
+ 繰り返しになりますがpythonじゃあるまいしローカルスコープでグローバル変数が使えないなんて事は無いですよ?
26
+
27
+
28
+
29
+ [サンプル](https://jsfiddle.net/c8gyxcc0/)
30
+
31
+
32
+
33
+ もしずっと0なのでしたら、そもそも`element.files.length`の値が0だったりしませんか?
34
+
35
+
36
+
37
+ ちなみに実行タイミング的に`console.log(file_length);//ここのグローバル変数を加算していきたい!`における出力は`0`が正しいです。

2

文言の編集

2017/10/10 11:06

投稿

namnium1125
namnium1125

スコア2043

test CHANGED
@@ -8,8 +8,8 @@
8
8
 
9
9
  ##
10
10
 
11
- 追記:
11
+ [加筆]に対し追記:
12
12
 
13
13
 
14
14
 
15
- javascriptの場合、一番外側で宣言した変数は特に何も気にすることなくグローバル変数として使用できたはずです。
15
+ javascriptの場合、外側で宣言した変数は特に何も気にすることなくグローバル変数として使用できたはずです。

1

追記

2017/10/10 10:49

投稿

namnium1125
namnium1125

スコア2043

test CHANGED
@@ -3,3 +3,13 @@
3
3
 
4
4
 
5
5
  `var file_length = 0;`とするべきです。
6
+
7
+
8
+
9
+ ##
10
+
11
+ 追記:
12
+
13
+
14
+
15
+ javascriptの場合、一番外側で宣言した変数は特に何も気にすることなくグローバル変数として使用できたはずです。