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;ますx=y;。そして、var x = undefined;コードの先頭に移動します。そして、x=y;元のステートメントと同じ場所になります。スタックに関することを理解していなくても、気にしないでください。これは、コンパイラが関数呼び出しをアセンブリに変換する方法です。時間があれば、知っておく価値があります。ここで重要なことではありません。

とにかく - これらの変更の直後に、おそらくいくつかの最適化が行われ、結果のコードが実行されます。これはあなたが書いたコードではなく、同等のものです。引数の再定義で指摘したのは、この変換が見えるようになるエッジケースです。

于 2012-06-19T23:32:56.790 に答える
2

次のように考えてください。

var name = name;

nameの値を設定できる唯一の方法は、が既に定義されてnameいる場合です。必要な値が既にある場合は、2 回行う必要はありません。namename

于 2012-06-19T23:16:05.830 に答える
2

まあ、いくら説明しても問題ないと思います。)

まず、関数のすべてのパラメーターは、この関数のローカルとして既に宣言されています。(もう少し複雑ですが、この説明でほとんどがカバーされているとしましょう)。したがって、それらを再度定義しても意味がありません。その後、「よりローカル」になることはありません。)))

第二に、 を書くことができるのと同じ理由で、var name = name内に書くことが可能です。2 番目は黙って無視されます。function(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);によって 2 つの異なる結果が得られます (再定義したため)。許可されていますが、行うのはお勧めできません。

編集:興味深いことに(私はこれを知りませんでした)、上記を行うと暗黙のarguments[]配列も台無しになります。たとえば、次のようにします。

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

関数内のどこか (再割り当て後) では、まだoopsandが出力されrawrます。明らかに、これは悪い、悪い考えです。

于 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 に答える