javascript函数中是否允许相同的变量和参数名称?

时间:2012-06-19 23:05:46

标签: javascript

作为一个例子我可以使用相同的变量和参数吗?我可以遇到什么问题?

示例代码

function mytask(name,title){
            var name = name;
            var title = title;
            var showalert = ("Hi " + name + " your job title is " + title);
            console.log(showalert);
            return showalert;
        }

document.write(mytask("dan", "administrator"));

7 个答案:

答案 0 :(得分:5)

在javascript中你可以认为,范围是用我的大括号定义的:{},并且范围内的变量可以重新定义,所以请看:

function x(){
  var name=3;
  var name=4;
  console.log(name); // output is: 4
}
x();

但这只是半真的,实际上发生的是解释器遍历代码,并将所有var语句移到开头,同时为它们分配undefined(以及所有参数)定义并从堆栈中获取,然后您编写的代码将运行。所以在第一个之后的任何var都被忽略了。你写的代码等于:

function mytask(name,title){
   var name = arguments[0];
   var title = arguments[1];
   name = name;
   title = title;
   var showalert = ("Hi " + name + " your job title is " + title);
   console.log(showalert);
   return showalert;
}

document.write(mytask("dan", "administrator"));

所以你的再减速,分配是多余的。无论如何 - 范围没有变化,没有别的东西会有所不同。

<强>

修改

解释器会检查您的代码,执行任何操作时,任何var x = y;语句都会分为var x = undefined;x=y;。并且var x = undefined;将移动到代码的顶部。并且x=y;将与原始陈述位于同一位置。如果您不了解堆栈的内容,请不要打扰,这就是编译器将函数调用转换为汇编的方式 - 如果您有时间,则值得了解;但不是重要的事情。

无论如何 - 在这些更改之后,可能会进行一些优化,生成的代码就会被执行。这不是你写的代码,而是一个相同的代码。你在重新定义参数时指出的是一个边缘情况,这种转换变得可见。

答案 1 :(得分:2)

以这种方式思考:

var name = name;

name的唯一方式可以设置为name的值,如果name已经已经定义。如果name已经具有您想要的值,则无需执行两次。

答案 2 :(得分:2)

好吧,我想一些解释不会受到伤害。 )

首先,所有函数的参数都已声明为此函数的本地。 (这有点复杂,但我们可以说这个解释涵盖了大部分内容)。因此,再次定义它们是没有用的:它们不会在它之后成为“更本地化”。 ))

其次,可以在var name = name内写function(name),原因与编写var name = 123; var name = 345;的原因相同。第二个var将被默默忽略。

如果你写var name = 123; var name = name;,你只会浪费一些键击 - 再次,它与你在代码中的某处写name = name;一样。 )

而那,顺便说一下,搞砸了arguments。请注意,name实际上是其元素的别名。

答案 3 :(得分:1)

当然可以遇到问题。看看这个。

function mytask(name,title){
            console.log(name);
            console.log(title)
            var name = "oops";
            var title = "rawr";
            console.log(name);
            console.log(title)
}

mytask("dan", "administrator");

除了非常混乱之外,调用console.log(name);会给我们两个不同的结果(因为我们重新定义了它)。这是允许的,但这不是一个好主意。

编辑:有趣的是(我不知道这一点),执行上述操作也会隐藏隐式arguments[]数组。例如,做:

for( var i = 0; i < arguments.length; ++i ) {
    console.log(arguments[i]);
}

我们的函数内部(重新分配后)仍会输出oopsrawr。显然,这是一个糟糕的坏主意。

答案 4 :(得分:1)

您可以使用与参数同名的变量,因为无论如何该值都是相同的,除非具有相同名称的变量具有与参数不同的值。

答案 5 :(得分:1)

实际上没有理由这样做。将它们传递给函数后,它们将被初始化,您可以使用它们而无需将它们重新分配给其他变量。

答案 6 :(得分:0)


<script>

    //this function returns what you give as argument
    function func1(name1) {
        let name1 = "mess shahadat"; //can't declare name, cause already getting name as parameter. thus this gives error if you define a variable same name as parameter with let. cause you can't redeclare let variable in javascript
    }

    document.write(func1("mike"))


</script>

在 javascript 中,函数参数就像局部变量一样工作。在函数内部,如果使用 var 关键字声明变量并使用与参数相同的名称,则它将返回 undefined。如果你用 let 关键字声明变量,你会得到一个错误。因为 let 变量不可重新声明。

所以当你需要同名的变量与参数有不同的值时,不要使用相同的变量名作为参数,因为它可能会成为你项目中的错误。

示例:

<script>

    //constructor function
    let mobile = function (modelNo, ram, price) {
        this.model = modelNo;
        this.ram = ram;
        let price = price + 1000; //can't declare price, cause already getting price as parameter. and let variables are not redeclarable
        this.price2 = function () { return price };
        this.totalPrice = function () { return "total price is: " + this.price2 }
    }

    let samsung = new mobile("samsung dous", "2gb", 3000);

    document.write(samsung.price2());

</script>