具有相同名称的变量声明

时间:2015-10-24 01:16:47

标签: javascript

如果我有以下代码:

var greeting = 'Hola';

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

console.log(greeting);

如果我对上述代码的理解是正确的,你能解释一下吗? 所以首先在IIFE内部:

var spanishGreeting = 'HOLA!!'; 

这行代码创建了一个全新的变量,其名称与传递给IIFE的参数相同(这个新的变量声明与该参数无关,spanishGreeting,传入IIFE是否正确?)。

此外:

spanishGreeting = 'Como estas!'

将在IIFE的当前执行上下文中查找spanishGreeting变量。现在问题是当前执行堆栈中有两个spanishGreeting变量。 IIFE参数中的那个和我刚创建的那个:

var spanishGreeting = 'HOLA!!';

JS引擎如何知道使用哪一个?

2 个答案:

答案 0 :(得分:2)

  

该代码行创建一个与参数

同名的全新变量

不,实际上它没有。只有一个范围(函数范围),其中一个变量名为spanishGreeting(第二个变量为name)。

忽略var,在参数确实引入后,它不会创建第二个变量。

当您调用该函数时,变量首先填充参数('Hola'),然后使用值'Como estas!'覆盖,然后使用值'HOLA!'覆盖。 / p>

但是,在某种情况下,您可以使用两个不同的变量 - 当它们位于不同的范围时:

var greeting = "Hello outer!";
function greet() {
    var greeting = "Hello inner!";
    console.log(greeting);
}
greet();
  

JS引擎如何知道使用哪一个?

这里,JS引擎只使用 local 变量(可以通过var声明,或者作为参数,在当前范围内没有区别)。内部变量被称为 shadow 外部变量。

顺便说一句,如果你使用ES6 let keyword声明你的变量,如果你试图重新声明一个已定义的变量(在同一范围内),引擎将抛出一个错误。

答案 1 :(得分:1)

我不是javascript专家但是。如果您的变量名称与"外部"匹配,则在函数内部变量,它将使用函数内部的局部变量。 据我所知,你可以用javascript 2方式声明变量:

var variable1 = 2,
    variable2 = 3;

或..

var variable1 = 1;
var variable2 = 3;

试试这个:

 var spanishGreeting = 'Como estas!',
     spanishGreeting = 'HOLA!';