请看我的例子:
var AbcVar = "abc";
function Abc(AbcVar){
console.log(AbcVar);
}
这是允许函数访问external var
的错误方式吗?
为什么console.log
的输出是undefined
?
最佳答案
是时候见见 Scoping 先生了。
说白了,作用域就是对变量的封装(注意在javascript中,函数也是变量。)现在,在我刚刚编造的虚构语言中,{
字符开始一个范围和}
结束它,变量用简单的相等定义(例如 x = 42
):
{ |
x = 42; |
{ | |
y = "I'm in an inner scope!"; | |
x == 42; //true | |
{ | | |
x == 42; | | |
y == "I'm in an inner scope!"; | | |
| x, y, z are defined |
z = "pyramid time!"; | | |
y = y + "...not"; | | x, y are defined | x is defined
} | | |
y == "I'm in an inner scope!...not"; | |
//z is not defined | |
x = 4; | |
} | |
x == 4; |
//y is undefined |
//z is undefined |
} |
javascript 有词法作用域。简而言之,函数创建了一个新的作用域:
var x = 42;
(funciton () {
x === 42;
var y = 5;
})();
//y is undefined
现在,有一个额外的地方可以创建变量,那就是在函数参数中。以下两个函数的行为相同(arguments
是一个包含传递给函数的参数的伪数组):
function parameterfull(a, b, c) {
//do stuff with a, b, c
}
function parameterless() {
var a = arguments[0], b = arguments[1], c = arguments[2];
//do stuff with a, b, c
}
如果你碰巧没有传递一个参数,它的值将是undefined
.
现在,使用你的函数和上面的翻译:
var AbcVar = "abc";
function Abc() {
var AbcVar = arguments[0];
console.log(AbcVar);
}
现在你明白为什么了 AbcVar
是(有时)undefined
在函数内部。
tl;dr 函数参数AbcVar
正在覆盖全局变量 AbcVar
,并且由于您没有将值传递给函数,因此它是 undefined
(但仅在函数内部,全局 AbcVar
保持不变。)
关于scope - 从 jQuery 函数外部访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8008684/