多年来,我一直在尝试学习javascript。我至少完成了10个代码训练营,udemy课程和一些周末课程。我仍然没有答案可以理解为什么在此示例中a不等于函数外部的值?
在函数语句中未调用它。在函数内部,根本没有将其定义为var。如果b的值来自函数外部,那么为什么在函数外部调用a时却使用函数内部定义的var b?
在哪里可以解密这些文件?
这在语义上等效于
function avg()
形式。它非常强大,因为它使您可以在通常放置表达式的任何位置放置完整的函数定义。这启用了各种巧妙的技巧。这是“隐藏”某些局部变量的一种方法,例如C中的块作用域:
var a = 1;
var b = 2;
(function() {
var b = 3;
a += b;
})();
a; // 4
b; // 2
答案 0 :(得分:1)
因为要在函数内部创建一个新变量(请注意使用var
)。就像你写的一样
var a = 1;
var b = 2;
(function() {
var someOtherName = 3;
a += someOtherName;
})();
碰巧函数外部的变量与函数内部的变量具有相同的名称。它们是完全独立的变量,除了具有相同的名称外没有任何关系。 a
加上了3,因为这是局部变量b
的值。本地b
“遮盖了”全局b
。
答案 1 :(得分:0)
var
控制变量的范围;因为“ b”在闭包内被重新声明为var,所以它实际上是一个新变量(恰好与闭包外的“ b”变量具有相同的名称。)“ a”未用“ var”重新声明,因此在闭包“ a”内部继续引用全局变量“ a”。
var a = 1; // Global "a"
var b = 2; // Global "b"
(function() {
var b = 3; // "var" indicates a new "b" variable, declared inside the closure.
// The local "b" masks the global "b" while inside the closure.
a += b; // Global "a" (1) added to local "b" (3)
})();
a; // 4 (global "a")
b; // 2 (global "b", still 2, because the in-closure "b" is no longer in scope)
这当然是令人困惑的。出于这个原因,通常最好在每个作用域级别使用名称不同的变量,而不要像上面的代码示例中那样依赖于掩码。无论您发现哪种来源将这种事情描述为“聪明的把戏”,都应以偏见忽略。
答案 2 :(得分:0)
我认为您的想法不正确。当您在函数内部对B进行新的实例化时,外部B被忽略(但这仅在函数内部起作用)。
由于您正在使用函数外部的A与函数内部的B求和,所以A的值为4(1 + 3)。另一方面,B仍然从外部看2。