Javascript函数-解密有关基本函数的文档

时间:2019-05-08 01:05:29

标签: javascript function

多年来,我一直在尝试学习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

3 个答案:

答案 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。