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

javascript函数中是否允许使用相同的变量和参数名?,javascript,Javascript,例如,是否允许我使用相同的变量和参数?我会遇到什么问题 示例代码 function mytask(name,title){ var name = name; var title = title; var showalert = ("Hi " + name + " your job title is " + title); console.log(showalert); retu

例如,是否允许我使用相同的变量和参数?我会遇到什么问题

示例代码

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

你肯定会遇到问题。看看这个

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)给了我们两个不同的结果(因为我们重新定义了它)。这是允许的,但这不是一个好主意

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

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

函数内部的某个地方(重新分配后)仍然输出
oops
rawr
。显然,这是一个坏主意。

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

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

这样想:

var name = name;

如果已经定义了
name
,则可以将
name
的值设置为
name
。如果
name
已经有了您想要的值,则无需重复两次。

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

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

其次,可以在
函数(name)
中写入
var name=name
,原因与写入
var name=123相同;变量名称=345。第二个
var
将被默默忽略

如果你写
var name=123;变量名称=名称
,您只需浪费一些击键—同样,这与您编写
name=name代码中的某个地方。)


顺便说一句,这解释了把
参数弄乱的原因。请看,
name
实际上是其元素的别名。

在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"));
因此,您的重新减速和分配是多余的。无论如何,范围不会改变,其他的都不会改变

编辑

解释器检查您的代码,执行任何内容,any
var x=y语句将拆分为
var x=undefined
x=y
var x=未定义将移动到代码的顶部。而
x=y将与原始语句位于同一位置。如果您不了解有关堆栈的内容,请不要费心,编译器就是这样将函数调用转换为程序集的——如果您有时间,这是值得了解的;但这不是最重要的

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



<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>
//此函数返回您作为参数给出的值 函数func1(名称1){ let name1=“mess shahadat”;//无法声明名称,因为已将名称作为参数。因此,如果使用let定义与参数同名的变量,则会出现错误。因为无法在javascript中重新声明let变量 } 文件写入(func1(“mike”))
在javascript中,函数参数的工作方式类似于局部变量。在函数内部,若您用var关键字声明变量并使用和参数相同的名称,那个么它将返回未定义的。如果你用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>

//构造函数
let mobile=功能(型号、ram、价格){
this.model=modelNo;
this.ram=ram;
let price=price+1000;//无法声明价格,因为已将价格作为参数获取。并且let变量不可重新声明
this.price2=函数(){return price};
this.totalPrice=函数(){return“总价为:“+this.price2}”
}
让三星=新手机(“三星豆”,“2gb”,3000);
document.write(samsung.price2());

您为什么要这样做?为什么不直接使用参数值呢?仅仅为了接收参数值而声明新变量是毫无意义的。您可以直接使用param变量。将变量重新声明为相同名称的唯一原因可能是提供默认值:
var name=name | |“Jeff”
(或者,可能是,
name=name?name:'Jeff';
),但仅在参数可选的情况下。@PeanutsMonkey:为了好玩,这里有一个演示:展示我能想到的唯一理由;尽管注意,
var
不是必需的。因为它已经被定义为传递给函数的参数/参数。您能不能请elabo