请参阅我的摘要:
var AbcVar = "abc";
function Abc(AbcVar){
console.log(AbcVar);
}
这是允许函数访问external var
的错误方法吗?
为什么console.log
undefined
的输出?
答案 0 :(得分:5)
是时候见到斯科平先生了。
简单地说,范围是变量的封装(请注意,在javascript中,函数也是变量。)现在,在我刚刚编写的虚构语言中,{
字符开始一个范围并{{1}结束它,变量用简单的相等定义(例如}
):
x = 42
javascript有词汇范围。简而言之,函数创建了一个新范围:
{ |
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 |
} |
现在,还有一个可以创建变量的地方,那就是函数参数。以下两个函数的行为相同(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
在函数内部。
tl; dr 函数参数undefined
正在覆盖全局变量AbcVar
,并且因为您没有将值传递给函数,所以它是{{1} (但仅在函数内部,全局AbcVar
保持不变。)
答案 1 :(得分:1)
在函数内部,AbcVar
将引用该函数的参数 AbcVar
。如果未传递任何参数,则值为undefined
。
参数 shadow 更高范围内具有相同名称的变量。 如果要访问它,则必须删除或重命名参数。也就是说,你应该总是喜欢将参数传递给函数(如果可能的话)。
答案 2 :(得分:0)
如果您运行刚刚创建的功能并将其传递给AbcVar
,
console.log(AbcVar);
按预期记录"abc"
考虑以下代码
var AbcVar = "abc";
function logVariable(passedIn){
console.log(passedIn);
}
logVariable(AbcVar);
创建一个变量,一个记录变量值的函数,然后将变量传递给记录器,记录器在控制台中记录它
如果您在运行记录器功能后发现交互式控制台上有两行:abc
后跟undefined
第一个是调用console.log()时打印的行,第二个是执行后logVariable返回的值,成功时为undefined
。
答案 3 :(得分:0)
嗨,您可以将其更改为
var AbcVar = "abc";
function Abc(bbb){
console.log(AbcVar);
}
你可以访问外部全局变量,如果你写内部函数,它就像假设一样;
var AbcVar = "abc";
function Abc(var AbcVar){
console.log(AbcVar);
}
so inside funciton AbcVar is new vaiable and null ,it shadow global AbcVar