内存具有相同名称的变量的位置

时间:2015-11-01 07:08:58

标签: javascript

(function(spanishGreeting, name){
    var spanishGreeting = 'HOLA!!';
    spanishGreeting = 'Como estas!'
    console.log(spanishGreeting);
}(greeting,'John'));

如果我对上述代码的理解是正确的,有人可以向我解释一下吗?

首先在IIFE var spanishGreeting = 'HOLA!!';内部,这行代码创建一个全新的变量,其名称与传递给IIFE的参数相同。那么这个新的变量声明会覆盖作为参数传入的变量吗?基本上传入的变量spanishGreeting将在函数的其余部分被忽略。

现在参数变量spanishGreeting是否仍然存在于内存中?或者有新的变量声明:var spanishGreeting = 'HOLA!!';覆盖了参数变量spanishGreeting的内存位置?

1 个答案:

答案 0 :(得分:2)

  

现在参数变量spanishGreeting仍然存在于内存中?

是的,它仍然存在于记忆中。这一行:

var spanishGreeting = 'HOLA!!'; 

创建一个新的局部变量,该变量以相同的名称隐藏/隐藏参数。仍然可以使用spanishGreeting访问arguments[0]参数。参数变量仍然存在 - 您只是隐藏了名称,因此您无法通过名称访问它。

而且,这一行:

spanishGreeting = 'Como estas!'

只是为上一行刚刚创建的局部变量赋值。它根本不会改变参数变量。

一般来说,你应该避免使用相同的名称来命名参数和局部变量,因为它只会让读取代码的人感到困惑。

  

这个新的变量声明会覆盖变量   作为参数传入?

没有。新变量声明会覆盖名称,但不会替换参数变量本身。它仍然可以通过arguments[0]访问。 Javascript中的命名是分层的。最接近的范围名称首先解析 - 如果没有找到,Javascript会查找链中较高位置的链。局部变量是它看起来的第一个位置,然后是参数名称,然后是下一个范围内的变量,依此类推,最后是全局变量。