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