2015-11-01 53 views
1
(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的内存位置?

回答

2

现在是参数变量西班牙语仍然存在内存中?

是的,它仍然存在于内存中。此行:

var spanishGreeting = 'HOLA!!'; 

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

而且,这条线:

spanishGreeting = 'Como estas!' 

只是分配一个新的值到前一行刚创建的局部变量。它根本不改变参数变量。

一般来说,你应该避免命名具有相同名称的参数和局部变量,因为它只会混淆读取你的代码的人。

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

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

+0

非常感谢您的详细解答!它清除了很多问题,我有哈哈...! – LP496