Разрешены ли одинаковые имена переменных и параметров в функции javascript?

В качестве примера я могу использовать одну и ту же переменную и параметр? С какими проблемами я могу столкнуться?

Образец кода

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

Ответ 1

Хорошо в 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; будет в том же месте, что и исходное выражение. Если вы не понимаете вещи о стеке, не беспокойтесь о том, как компиляторы преобразуют вызовы функций в сборку - это стоит знать, если у вас есть время; но не главное здесь.

В любом случае - сразу после этих изменений и, возможно, некоторые оптимизации сделаны, полученный код выполняется. Это не тот код, который вы написали, а равный. То, что вы указали при переопределении аргументов, - это краевой случай, когда эти преобразования становятся видимыми.

Ответ 2

Подумайте об этом таким образом:

var name = name;

Единственный способ name может быть установлено на значение name, если name уже определено. Нет необходимости делать это дважды, если name уже имеет нужное значение.

Ответ 3

Ну, я полагаю, что какое-то объяснение не повредит. )

Во-первых, все параметры функции уже объявлены локальными для этой функции. (это немного сложнее, но пусть это объяснение охватывает большинство из них). Поэтому на самом деле бесполезно определять их снова: после этого они не станут "более локальными". ))

Во-вторых, возможно написать var name = name в function(name) по тем же причинам, почему можно написать var name = 123; var name = 345; var name = 123; var name = 345; , Второй var будет просто игнорироваться.

И если вы пишете var name = 123; var name = name; var name = 123; var name = name; , вы просто отбросьте несколько нажатий клавиш - как, опять же, это то же самое, что вы пишете name = name; где-то в вашем коде. )

И это, кстати, объясняет испорченность arguments. См., name на самом деле является псевдонимом для его элемента.

Ответ 4

Конечно, вы можете столкнуться с проблемами. Взгляните на это.

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]);
}

где-то внутри нашей функции (пост-переназначение) по-прежнему rawr oops и rawr. Очевидно, это плохая, плохая идея.

Ответ 5

Вы можете использовать переменные с тем же именем, что и параметры, поскольку значение будет одинаковым в любом случае, если переменная с тем же именем не будет иметь другое значение, чем параметр.

Ответ 6

На самом деле нет причин для этого. После того, как вы передадите их функции, они инициализируются, и вы можете использовать их, не переназначая их другим переменным.