(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
的内存位置?
答案 0 :(得分:2)
现在参数变量spanishGreeting仍然存在于内存中?
是的,它仍然存在于记忆中。这一行:
var spanishGreeting = 'HOLA!!';
创建一个新的局部变量,该变量以相同的名称隐藏/隐藏参数。仍然可以使用spanishGreeting
访问arguments[0]
参数。参数变量仍然存在 - 您只是隐藏了名称,因此您无法通过名称访问它。
而且,这一行:
spanishGreeting = 'Como estas!'
只是为上一行刚刚创建的局部变量赋值。它根本不会改变参数变量。
一般来说,你应该避免使用相同的名称来命名参数和局部变量,因为它只会让读取代码的人感到困惑。
这个新的变量声明会覆盖变量 作为参数传入?
没有。新变量声明会覆盖名称,但不会替换参数变量本身。它仍然可以通过arguments[0]
访问。 Javascript中的命名是分层的。最接近的范围名称首先解析 - 如果没有找到,Javascript会查找链中较高位置的链。局部变量是它看起来的第一个位置,然后是参数名称,然后是下一个范围内的变量,依此类推,最后是全局变量。