Cha*_*ies 5 javascript variables
所以我想说我有一些代码:
//Javascript
var elements = [];
function addNumbah1(){
var i = 1;
elements.push(i);
}
function addNumbah2(){
var i = 2;
elements.push(i);
}
Run Code Online (Sandbox Code Playgroud)
这继续addNumbah999(),i
每次声明变量是不好的形式?会破坏什么吗?我应该这样做:
//Javascript
var elements = [];
var i
function addNumbah1(){
i = 1;
elements.push(i);
}
function addNumbah2(){
i = 2;
elements.push(i);
}
Run Code Online (Sandbox Code Playgroud)
Eli*_*gem 18
简短回答:不,JS将所有变量声明提升到范围的顶部,无论您声明它们多少次:
var i = 0
for (var i=0;i<10;i++)
{
var j = i%2;//declared 10 times, on each iteration
}
Run Code Online (Sandbox Code Playgroud)
将被翻译成
var i, j; //i is undefined at this point in the code.
for (i = 0;i<10;i++)
{
j = i%2;//declared 10 times, on each iteration
}
Run Code Online (Sandbox Code Playgroud)
在第一个示例中,您将声明i
为函数范围中的变量,这是您必须要做的,以避免混淆全局范围.这些变量使用的内存在调用函数时分配,并在函数返回时释放(粗略地说,闭包形成一个异常,但这会把我们带到远处).考虑一下:
var i = 10;
function someF()
{
var i = 1;
alert(i);
}
someF();//alerts 1 <-- value of i, local to someF
alert(i);//10, global i is unchanged
Run Code Online (Sandbox Code Playgroud)
但如果你要省略var
:
function someF()
{
i = 1;
alert(i);
}
Run Code Online (Sandbox Code Playgroud)
你会看到1被提醒两次.如果JS在当前作用域中找不到变量声明,它将在更高的作用域中查找,直到找到var.如果没有找到变量,JS将在最高范围(全局)中为您创建一个变量.在这里查看我的答案,了解隐含的全局变量如何用于更详细的示例,或者阅读MDN页面,尤其是关于名称冲突的部分
最后,我想补充一点,全局变量,特别是隐含的全局变量,都是邪恶的.还要知道ECMA6标准明显偏离了全局变量,并引入了对真正的块范围的支持.正如你在这里看到的
哦,如果你想检查函数是否使用隐含的全局变量:'use strict';
是一件好事:
(function()
{
'use strict';
var localVar = 123;//ok
impliedGlobal = 123;//TypeError!
}());
Run Code Online (Sandbox Code Playgroud)
如您所见,不允许使用隐含的全局变量.有关完整说明,请参阅严格模式下的MDN
归档时间: |
|
查看次数: |
8932 次 |
最近记录: |