这个问题在这里已经有了答案:
8年前关闭。
Possible Duplicate:
JavaScript Variable Scope
我(显然)对 Javascript 非常陌生,并且我已经在其他线程上看到了关于全局和局部变量的使用的几个不同观点,但我试图将有关该主题的一些基本观点锁定在一个地方。
以下在函数外部声明(或在函数内部使用)之间有什么区别?
变量事物 = 1;
东西 = 1;
我知道使用 var 声明了它当前范围内的变量。因此,省略 var 使其成为全局性的。有哪些可能会出现的陷阱?有人可以举一个简单的例子来说明在这种情况下变量可能会相互影响的地方吗?
提前致谢。
最佳答案
for
循环,你想用它们做点什么。 .
for (i = 0; i < elements.length; i++) {
element = elements[i];
for (i = 0; i < items.length) {
item = items[i];
element.add(item);
}
}
这段伪代码可以在许多不同的语言中正常工作。
程序会看到一个内循环和一个外循环,并且可以告诉
i
不是指同一件事。在 JavaScript 中,它们是相同的
i
.那是因为其他语言具有块作用域——每当您输入新的大括号时,程序都会将变量视为新变量。
在 JavaScript 中只有函数作用域,这意味着函数内部的变量被视为新的,但在控制语句内部(
if
、 for
、 switch
),它们是具有相同值的相同变量。所以外循环设置
i
到 0,然后进入内循环。内部循环遍历它的所有项目列表,并构建
i
随着它的发展...然后它返回到外循环,然后
i
仍然等于 items.length - 1
...如果小于
elements.length
然后它在 i
上加 1 ,现在高于 items
长度,所以在内循环中什么也没有发生.........如果
items.length
大于 elements.length
相反,外循环在一次通过后就结束了。现在,我相信您可以开始考虑您可能想要使用
x
的时间。或 name
或 value
或 el
或 sum
或 i
或 default
或 src
或 url
或 img
或 script
等在你的整个程序中多次(甚至数万行),你可以开始考虑类似上面循环的情况,如果你尝试用相同的名字调用两个不同的东西,事情可能会出错。这与 var-fallthrough 的问题相同
如果您有一个函数使用名为
x
的变量另一个函数使用另一个名为 x
的变量,那太好了......除非你忘记声明变量。
// no problems!
function func1 () { var x = 0; }
function func2 () { var x = "Bob"; }
// big problems!
function func1 () { x = 0; }
function func2 () { x = "Bob"; }
func1
套装window.x = 0;
func2
套装window.x = "Bob";
...如果
window.x
应该等于 42,为了让其他程序正常工作,现在你有可能有 3 个损坏的应用程序,只是因为缺少一些 var
s。但是,它不会立即设置全局变量。它实际上做的是通过功能链。如果您在另一个函数内部创建一个函数,那么未声明的 var 将查找其父级的 vars,然后是其祖 parent 的 vars,然后是其曾祖 parent 的 vars...
如果它一直到
window
并且没有人拥有该名称的变量,然后它会在 window
上创建一个具有该名称的变量。 .function func1 () {
var x = 0;
function func2 () {
var y = 1;
x = 2;
z = 3;
}
func2();
}
当您调用 func1 时,它会设置自己的
x
到 0,并调用 func2。func2 设置自己的
y
到 1。然后它设置func1的
x
到 2。然后,因为 func2 没有
z
而 func1 没有 z
和 window
没有 z
,它设置 window.z
到 3。这只是困惑的开始,为什么它是一个非常非常好的主意,以确保您定义的变量需要在该函数内部可用(以及在该函数内部创建的任何函数中)......
...当你引用预先存在的变量时,你会仔细引用它们,并知道该变量应该在你的代码中的位置(哪个函数定义了它............所以程序在链上的位置在它到达
window
之前停止查看),以及为什么要从另一个函数内部更改它。
关于javascript - 变量作用域上的简单点 - Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12805493/