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"));
因此,您的重新减速和分配是多余的。无论如何,范围不会改变,其他的都不会改变
编辑
解释器检查您的代码,执行任何内容,anyvar 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