我正在学习javascript范围链。在函数中声明变量时,在另一个函数中无法看到它。例如,myVar在函数a中声明,在函数b中无法看到:
function b() {
console.log(myVar);
}
function a() {
var myVar = 2;
b();
}
a(); //->myVar is not defined
但是为什么一个函数可以将其参数传递给它的内部函数调用(而不是嵌套的新函数)?参数应该是函数的局部变量吗?
function b(str) {
console.log(str);
}
function a(str) {
b(str);
}
a("a's argument"); //->"a's argument"
答案 0 :(得分:0)
是的,但是当您将function b() {
console.log(str);
}
function a(str) {
b();
}
a("a's argument"); //->undefined
道具明确传递给b函数时,它才有效。
什么不该起作用:
format_number
答案 1 :(得分:0)
您的示例中的两个变量具有相同的名称这一事实并不意味着什么,因为它们在不同的范围内定义。
在功能a
中执行
b(str);
您正在做的是将函数str
中参数a
的值复制到另一个变量,函数str
中的参数b
。
在内部,变量只是引用内存地址的简单方法。当您致电b(str)
时,您正在复制b->str
相同的值a->str
,但最后,您有两个不同的内存地址包含相同的值(指针) a's argument
字符串)。
JavaScript解释器/编译器知道它们是两个不同的地址,因为它们属于两个不同的范围。
如果你这样做:
function b(str) {
setTimeout(function() { console.log(str) }, 1000);
}
function a(str) {
b(str);
str = 'new value';
console.log(str);
}
a("a's argument");

您会看到,尽管在b->str
中更改了a
的值,但当setTimeout
中的b
执行时,它会注销原始值,即使在console.log
a
后显示更改后的值,也会记录原始值。