1. Сначала используются локальные переменные, а затем объявляются, что не влияет на внешние переменные с таким же именем.
Скопируйте код кода следующим образом:
var x = 1 // --> внешняя переменная x
функция фн(){
alert(x); // --> сначала используется неопределенная локальная переменная x
var x = 2 // объявить и назначить позже
}
ФН();
предупреждение(х); // --> 1<BR>;
Первый момент заключается в том, что первое предложение функции fn выводит x, а x определяется во втором предложении. Это разрешено в JS, а здесь разрешено означает, что программа может работать без синтаксических ошибок.
Но это не разрешено в других языках, таких как C и Java. Переменные должны быть объявлены перед использованием, например
Скопируйте код кода следующим образом:
тест публичного класса {
public static void main(String[] args) {
System.out.println(x); //Использовать первым
int x = 10 // Сообщение объявления
}
}
В Java компилятор выдаст ошибку, и программа не сможет запуститься.
Второй момент заключается в том, что локальная переменная x внутри функции fn не будет влиять на внешнюю переменную x. То есть вывод предупреждения в fn равен не 1, а неопределенным.
Во-вторых, формальные параметры имеют более высокий приоритет, чем имена функций.
Скопируйте код кода следующим образом:
функция fn(fn){
оповещение (ФН);
}
fn('привет'); // --> "привет"
Вы можете видеть, что имя функции и формальный параметр имеют то же имя, что и fn, а выходными данными является строка «привет», а не тело функции (fn.toString()) функции fn.
В-третьих, формальные параметры имеют более высокий приоритет, чем аргументы.
Скопируйте код кода следующим образом:
функция fn(аргументы){
предупреждение (аргументы);
}
fn('привет'); // --> "привет"<BR>
Объект аргументов может использоваться непосредственно внутри функции и представляет собой специальный идентификатор, предоставляемый самим языком.
Здесь бывает, что формальный параметр объявлен с таким же именем. Вы можете видеть, что на выходе отображается «привет» вместо «[объект объекта]», то есть аргументы формальных параметров охватывают реальные аргументы, предоставляемые самим языком.
4. Формальные параметры имеют более высокий приоритет, чем локальные переменные, которые объявлены, но не назначены.
Скопируйте код кода следующим образом:
функция fn(a){
вар а;
предупреждение(а);
}
fn('привет'); // --> "привет"
Формальным параметром функции fn является a. Первое предложение функции только объявляет локальную переменную a, но не присваивает значение. Из того факта, что выходным результатом является «привет», а не неопределенное значение, можно видеть, что формальный параметр a имеет более высокий приоритет, чем локальная переменная a, которая только объявлена, но не имеет значения.
5. Объявленные и назначенные локальные переменные имеют более высокий приоритет, чем формальные параметры.
Скопируйте код кода следующим образом:
функция fn(a){
вар а = 1;
предупреждение(а);
}
fn('привет'); // --> "1"
Формальным параметром функции fn является a. Первое предложение функции только объявляет локальную переменную a и присваивает ей значение 1. Из выходного результата «1» вместо «привет» мы видим, что объявленная и присвоенная локальная переменная a имеет более высокий приоритет, чем формальный параметр a.
6. Когда формальные параметры присваиваются одноимённым локальным переменным
Скопируйте код кода следующим образом:
функция fn(a){
вар а = а;
предупреждение(а);
}
ФН('привет');
Пока не запускайте, угадайте результат. Если следовать пункту 5: объявленные и назначенные локальные переменные имеют более высокий приоритет, чем формальные параметры. Тогда a будет неопределенным. Но на самом деле a — это «привет», то есть правый a — это формальный параметр a, а левый a — локальная переменная a.
Две а здесь не мешают друг другу и не закрывают друг друга. Это противоречит тому, что я только что сказал: назначенные локальные переменные имеют более высокий приоритет, чем формальные параметры. Но движок делает то, что мы хотим, потому что мы не хотим, чтобы a было неопределенным после var a = a.