【问题标题】:Adding function parameters creates variable shadowing, while no parameters result in reassignment?添加函数参数会创建变量阴影,而没有参数会导致重新分配?
【发布时间】:2021-12-16 10:20:48
【问题描述】:

下面我有 2 个例子,唯一的区别是一个函数有参数,而另一个没有。但是示例 1 会将 hello 记录到控制台,而示例 2 会将 hello! 记录到控制台。

我的问题是为什么示例 1 记录 hello 而示例 2 记录 hello!

示例 1,我不确定发生了什么。我的猜测是,在示例 1 中,我们使用了可变阴影。 greet 参数被初始化为原始字符串hellogreet 参数隐藏了第 1 行中的 greet。因此,当我们将 greet 记录到控制台时,我们将在全局范围内记录 greethello

我并不肯定,但在示例 2 中,函数 salutation 是使用参数 'hello' 调用的。然后将全局变量greet 重新赋值为'hello' + '!' 的值。因此,当greet 被记录到控制台时,我们记录了greet 被重新分配给的值hello!

为什么函数中缺少greet 参数允许我们将重新分配的值记录到控制台。但是当函数有参数时,我们将全局变量记录到控制台?

示例 1.

let greet = 'hello';

function salutation(greet) {
    greet = greet + '!';
}

salutation(greet);
console.log(greet); //hello

示例 2。

let greet = 'hello';

function salutation() {
    greet = greet + '!';
}

salutation(greet);
console.log(greet); //'hello!'

【问题讨论】:

标签: javascript function scope shadowing


【解决方案1】:

为什么函数中缺少greet 参数允许我们将重新分配的值记录到控制台。但是当函数有参数时,我们将全局变量记录到控制台?

两个示例都将全局变量记录到控制台。

只是在第一个 sn-p 中,有一个局部变量 greet 被重新分配,而在第二个 sn-p 中没有局部变量,它分配(并访问)全局变量 greet通过关闭。

【讨论】:

    【解决方案2】:

    函数的参数是按值复制的,所以greet(全局)和greet(局部)是完全不同的。下面的行greet 是全局变量的副本,仅在函数内部可用,因此是局部变量。

    function salutation(greet) {
        greet = greet + '!';
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-15
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 2019-03-20
      相关资源
      最近更新 更多