JavaScript函数中允许的变量和参数名称是否相同
Are the same variable and parameter names allowed in a javascript function?
例如,我可以使用相同的变量和参数吗?我会遇到什么问题?
示例代码
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]);
}
我们函数内部的某个地方(重新分配后)仍然输出 oops
和 rawr
.显然,这是一个坏主意。
实际上没有理由这样做。将它们传递给函数后,它们将被初始化,您可以使用它们而无需将它们重新分配给其他变量。
您可以使用与参数同名的变量,因为值无论如何都是相同的,除非同名变量的值与参数不同。
<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>
- Javascript检查参数是否为零值
- 为什么 JSON.parse 无法检测参数是否已采用 JSON 格式
- Node.js如何知道回调的第一个参数是否是错误处理程序
- 检查参数是否传递给Java Script函数
- 自执行函数中的参数是否必要
- 如何确定参数是否为点击事件
- $interval的时间参数是否可以在间隔之间动态更改
- 使用和返回动态参数是否安全
- 如何检查传递到递归函数的参数是否是数组的元素
- 检查对象参数是否具有所有必需属性的最有效方法是什么
- 检查函数参数是否存在,并在JavaScript中键入
- JavaScript 检查函数参数是否满足条件
- 参数是否可以被覆盖
- 自定义 jquery 函数中的参数是否可以更改全局变量的值
- 检查传入参数是否在数组对象中
- 如何检查参数是否在JavaScript函数定义中定义
- 检查对象参数是否未定义
- 在javascript中检查参数是否被赋值
- 如何检查参数是否存在于node.js中的查询字符串中
- 猫鼬查找具有多个条件的记录并检查请求参数是否为空