15

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

示例代码

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

7 回答 7

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;and x=y;。并且var x = undefined;将被移动到代码的顶部。并且x=y;将与原始声明位于同一位置。如果您不了解有关堆栈的内容,请不要打扰,这就是编译器将函数调用转换为汇编的方式 - 如果您有时间,值得了解;但不是这里重要的事情。

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

于 2012-06-19T23:32:56.790 回答
2

这样想:

var name = name;

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

于 2012-06-19T23:16:05.830 回答
2

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

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

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

如果你写var name = 123; var name = name;,你只会浪费一些击键——同样,这和你name = name;在代码中的某个地方写是一样的。)

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

于 2012-06-19T23:18:41.490 回答
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. 显然,这是一个坏主意。

于 2012-06-19T23:10:25.597 回答
1

您可以使用与参数同名的变量,因为值将是相同的,除非同名变量的值与参数不同。

于 2012-06-19T23:10:30.947 回答
1

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

于 2012-06-19T23:10:57.620 回答
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>
于 2021-03-03T11:50:31.990 回答