2012-06-19 1 views
10

В качестве примера я могу использовать одну и ту же переменную и параметр? С какими проблемами я могу столкнуться?Разрешены ли одинаковые имена переменных и параметров в функции 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")); 
+0

Если бы вы могли, как бы вы относились к каждому из них? – cheeken

+0

Вы имеете в виду, можете ли вы использовать именованные аргументы, которые вы передаете функции, как имена переменных в функции? Да, да, вы можете. У вас возникли проблемы с этим? –

+0

Код работает. Однако я бы не хотел этого поддерживать. –

ответ

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

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

+0

Не могли бы вы рассказать о том, что вы подразумеваете под «Перемещает все инструкции var в начало, в то время как им назначается неопределенный (и все аргументы определяются и берутся из стека), а затем код, который вы написали, будет запускаться»? – PeanutsMonkey

+0

@PeanutsMonkey См. Править –

+0

Хорошо, просто чтобы понять, что вы имеете в виду, я начну срыгать. Дайте мне знать, если я неправильно понял. Если у меня есть функция, как в моем вопросе, где параметр и переменная совместно используют одно и то же объявление, вы хотите сказать, что интерпретатор разделил бы 'name = name' на' name = undefined' и 'name = name'. Это правильно? – PeanutsMonkey

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

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

1

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

1

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

2

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

var name = name; 

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

2

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

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

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

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

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

+0

Что вы подразумеваете под «Второй var будет просто молча игнорировать», а также объясняет испортить «аргументы»? – PeanutsMonkey

+0

Хотели бы вы, чтобы я объяснил, как подъем работает более подробно? – raina77ow

+0

@ raina77ow Будет ли это работать в «строгом» режиме? – Medorator

Смежные вопросы