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

Are the same variable and parameter names allowed in a javascript function?

本文关键字:参数 是否 变量 函数 JavaScript      更新时间:2023-09-26

例如,我可以使用相同的变量和参数吗?我会遇到什么问题?

示例代码

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"));

好吧,在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;将与原始语句位于同一位置。如果您不了解堆栈的内容,请不要打扰,这就是编译器将函数调用转换为汇编的方式 - 如果您有时间,值得了解;但这里不是重要的事情。

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

这样想:

var name = name;

可以将name设置为 name 值的唯一方法是已定义name如果name已经具有所需的值,则无需执行两次。

好吧,我想一些解释不会有什么坏处。

首先,函数的所有参数都已声明为此函数的本地参数。(它有点复杂,但假设这个解释涵盖了大部分内容)。因此,再次定义它们真的没有用:它们之后不会变得"更本地化"。))

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

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

顺便说一句,这解释了搞砸arguments.看,name实际上是其元素的别名。

当然,您可能会遇到问题。看看这个。

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 .显然,这是一个坏主意。

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

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


<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>