Bla*_*Box 57 javascript variables scope for-loop
关于JavaScript变量范围的快速问题.
为什么alert()
函数打印值i
而不是返回undefined
?
$(document).ready(function () {
for(var i = 0; i < 10; i += 1){
}
alert("What is 'i'? " + i);
});
Run Code Online (Sandbox Code Playgroud)
我对JS很新,在几乎所有其他语言中我都涉及过,for循环范围内的声明将包含该循环的值,但在这种情况下不是,为什么?
即What is 'i'? 10'
打印.
小智 54
的JavaScript没有块作用域,直到const
和let
介绍,只是功能范围.由于初始化var
在一个函数内,因此该变量可在同一函数中的任何其他位置访问.
来自MDN:
重要提示:JavaScript没有块范围.使用块引入的变量的范围限定为包含函数或脚本,并且设置它们的效果将持续超出块本身.换句话说,块语句不引入范围.虽然"独立"块是有效的语法,但您不希望在JavaScript中使用独立块,因为如果您认为它们在C或Java中执行类似块的操作,则它们不会按照您的想法执行操作.
Mat*_*arr 16
javascript人们正试图解决这个问题!
EcmaScript6(又名EcmaScript 2015)是去年夏天通过的最新版javascript,浏览器刚刚开始支持它的功能.
其中一个功能是具有"let"表达式的块范围局部变量.截至目前(2016年4月),主流浏览器的大多数当前版本都支持Safari,除了Safari.很少有移动浏览器支持此功能.
您可以在此处阅读更多相关信息(特别是请参阅"for循环中的let-scoped变量"部分):https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let
您可以在此处查看当前的浏览器支持(查找行Bindings - > let):https: //kangax.github.io/compat-table/es6/
Hit*_*mar 10
与其他语言(例如:Java,C++,C)不同,JavaScript不支持块范围.一旦在循环或函数中声明变量,如果你这样做,它的范围就在函数体内
for(i=0; i<arr.length; i++) {
var j=0;
// ...
}
Run Code Online (Sandbox Code Playgroud)
在这里,您i
将成为一个全局变量,并j
成为循环所在的函数或脚本的本地变量.
小智 9
for(i=0; i<arr.length; i++) {
var j=0;
// ...
}
Run Code Online (Sandbox Code Playgroud)
说上面创建一个全局变量是不正确的i
.我相信你应该总是使用var
声明变量(除非你故意想要'属性'而不是'变量' - 这在99.99%的JS编码场景中是不太可能的......)
var
在分配初始值时省略i
不创建局部甚至全局变量,它正在i
为全局对象创建一个属性(它看起来/表现得像一个全局变量 - 但它们有一些细微的差别).
更好的是:
var i;
for(i=0; i<arr.length; i++) {
var j=0;
// ...
}
Run Code Online (Sandbox Code Playgroud)
现在循环使用全局变量i
(或函数局部变量i
,如果此代码出现在函数中)
有关var关键字的函数和Javascript中的变量与属性的更多信息
- 注意,有点令人困惑的是你可以重新声明一个变量,例如在第二个循环中
for(var i=0; i<9; i++){
document.write('i = ' + i + '<br>');
}
for(var i=0; i<9; i++){
document.write('i = ' + i + '<br>');
}
Run Code Online (Sandbox Code Playgroud)
这似乎是有效的(我测试时没有错误).您似乎可以在JavaScript中重新声明变量 - 但除非有特殊情况,否则它可能不是一个好主意 - 请参阅此相关问题,提及[Google Analytics如何利用变量的'安全'重新声明](重新定义一个javascript变量)
i
在这个相关的SO问题中有一些关于在JS(以及循环变量)中重新声明变量的讨论:声明循环内部或外部的变量
归档时间: |
|
查看次数: |
55913 次 |
最近记录: |