|
@@ -68,7 +68,12 @@ function d()
|
|
{
|
|
{
|
|
debugger;
|
|
debugger;
|
|
}
|
|
}
|
|
|
|
+alert("before d");
|
|
|
|
+d()
|
|
|
|
+alert("after d");
|
|
|
|
+d()
|
|
```
|
|
```
|
|
|
|
+Для входа и выхода из функции используются `F11` и `Shift-F11` в **Developer Tools** при **пошаговой отладке**
|
|
|
|
|
|
- **Область видимости**. Так как функция не может "знать", из какого контекста она вызывается, то нет возможности знать заранее, совпадают ли имена
|
|
- **Область видимости**. Так как функция не может "знать", из какого контекста она вызывается, то нет возможности знать заранее, совпадают ли имена
|
|
переменных в функции и вне её. Таким образом вероятны *побочные эффекты* - непредсказуемые изменения переменных во внешнем коде, которые могут
|
|
переменных в функции и вне её. Таким образом вероятны *побочные эффекты* - непредсказуемые изменения переменных во внешнем коде, которые могут
|
|
@@ -78,9 +83,9 @@ function d()
|
|
var surname = "Петров";
|
|
var surname = "Петров";
|
|
function readSurname()
|
|
function readSurname()
|
|
{
|
|
{
|
|
- surname = prompt("Введите фамилию","")
|
|
|
|
|
|
+ surname = prompt("Введите фамилию","")
|
|
if (surname === null || surname === ""){
|
|
if (surname === null || surname === ""){
|
|
- surname = "Иванов"
|
|
|
|
|
|
+ surname = "Иванов"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -98,9 +103,9 @@ alert(surname);
|
|
var surname = "Петров";
|
|
var surname = "Петров";
|
|
function readSurname()
|
|
function readSurname()
|
|
{
|
|
{
|
|
- var surname = prompt("Введите фамилию","")
|
|
|
|
|
|
+ var surname = prompt("Введите фамилию","") // ТУТ
|
|
if (surname === null || surname === ""){
|
|
if (surname === null || surname === ""){
|
|
- surname = "Иванов"
|
|
|
|
|
|
+ surname = "Иванов"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
alert(surname);
|
|
alert(surname);
|
|
@@ -117,7 +122,7 @@ function readWithDefault(promptText, promptDefault, somethingDefault)
|
|
{
|
|
{
|
|
var something = prompt(promptText,promptDefault)
|
|
var something = prompt(promptText,promptDefault)
|
|
if (something === null || something === ""){
|
|
if (something === null || something === ""){
|
|
- something = somethingDefault;
|
|
|
|
|
|
+ something = somethingDefault;
|
|
}
|
|
}
|
|
alert("something: " + something);
|
|
alert("something: " + something);
|
|
}
|
|
}
|
|
@@ -134,7 +139,7 @@ function readWithDefault(promptText, promptDefault, somethingDefault)
|
|
{
|
|
{
|
|
var something = prompt(promptText,promptDefault)
|
|
var something = prompt(promptText,promptDefault)
|
|
if (something === null || something === ""){
|
|
if (something === null || something === ""){
|
|
- something = somethingDefault;
|
|
|
|
|
|
+ something = somethingDefault;
|
|
}
|
|
}
|
|
return something;
|
|
return something;
|
|
}
|
|
}
|
|
@@ -142,3 +147,121 @@ alert(surname);
|
|
var name = readWithDefault("Введите имя","","Иван");
|
|
var name = readWithDefault("Введите имя","","Иван");
|
|
alert(name);
|
|
alert(name);
|
|
```
|
|
```
|
|
|
|
+
|
|
|
|
+## Определение и выполнение функций
|
|
|
|
+
|
|
|
|
+Обратите внимание, что первый `alert` происходит ДО включения пошаговой отладки. Это говорит о том, что *определение функции* **НЕ** вызывает её.
|
|
|
|
+Код функции работает только после вызова, который происходит по d(). Для вызова надо указать в коде имя функции и скобки после имения (с параметрами
|
|
|
|
+или без оных)
|
|
|
|
+```javascript
|
|
|
|
+function d()
|
|
|
|
+{
|
|
|
|
+ debugger;
|
|
|
|
+}
|
|
|
|
+alert("before d");
|
|
|
|
+d()
|
|
|
|
+alert("after d");
|
|
|
|
+```
|
|
|
|
+
|
|
|
|
+Определение начинается с ключевого слова `function`, после которого идет имя функции и параметры в скобках через запятую. Далее идет блок кода функции
|
|
|
|
+в фигурных скобках. В отличие от `if`, `else` и циклов, фигурные скобки **обязательны**.
|
|
|
|
+
|
|
|
|
+### Именование функций
|
|
|
|
+
|
|
|
|
+Как и переменным, функциям нужно давать осмысленные названия. Только учтите, что переменные - *существительные* кода, а функции - *глаголы* кода.
|
|
|
|
+
|
|
|
|
+### Выполнение функций.
|
|
|
|
+
|
|
|
|
+Когда в коде упоминается имя функции со скобками и, возможно, параметрами происходят следующие действия:
|
|
|
|
+- вычисляются выражения в скобках. В функцию попадают уже *значения* выражений.
|
|
|
|
+- создается новая область видимости, в которую попадают параметры и их значения. Вам не нужно определять переменные для параметров.
|
|
|
|
+- начинается выполнение кода в фигурных скобках определения функции. Все переменные, определенные через `var` попадают в локальную область видимости функции, не перекрывающую внешнюю область видимости.
|
|
|
|
+- Код выполняется до выполнения `return` или окончания кода функции (закрывающей фигурной скобки). `return` прерывает выполнение функции, более того,
|
|
|
|
+ с помощью `return` происходит возврат значения функции, которое подставляется на место вызова функции. Таким образом функция ведет себя как
|
|
|
|
+ *переменная* для чтения. Если функция ничего не возвращает, то, на самом деле, она возвращает `undefined`
|
|
|
|
+
|
|
|
|
+```javascript
|
|
|
|
+function sqr(a){
|
|
|
|
+ alert("Вы передали:" + a);
|
|
|
|
+ return a*a;
|
|
|
|
+ alert("Этот код не выполнится");
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+var sqr1 = sqr(5)
|
|
|
|
+var otherVar = 2;
|
|
|
|
+alert("Сумма квадратов: " + (sqr1 + sqr(otherVar + otherVar)));
|
|
|
|
+```
|
|
|
|
+
|
|
|
|
+## Параметры функции и возвращаемое значение
|
|
|
|
+
|
|
|
|
+### Параметры (аргументы)
|
|
|
|
+
|
|
|
|
+Параметры функции перечисляются в скобках после имени через запятую. Параметры - это переменные области видимости функции, в которые попадают
|
|
|
|
+вычисленные значения, передаваемые при **вызове**. Таким образом функции получают данные из внешнего кода.
|
|
|
|
+
|
|
|
|
+В **Javascript** количество параметров при определении и при вызове может отличаться. В таком случае непереданные параметры равны `undefined`:
|
|
|
|
+```javascript
|
|
|
|
+debugger;
|
|
|
|
+function add(a,b)
|
|
|
|
+{
|
|
|
|
+ a = a || 0;
|
|
|
|
+ b = b || 0;
|
|
|
|
+ return a + b;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+alert(add())
|
|
|
|
+alert(add(1));
|
|
|
|
+alert(add(2,3));
|
|
|
|
+```
|
|
|
|
+
|
|
|
|
+Если же параметров больше, чем указано в определении функции, то ошибки тоже не происходит. Для доступа к остальным полям существует **псевдомассив**
|
|
|
|
+`arguments`.
|
|
|
|
+```javascript
|
|
|
|
+debugger;
|
|
|
|
+function add(a,b)
|
|
|
|
+{
|
|
|
|
+ console.log(arguments)
|
|
|
|
+ a = a || 0;
|
|
|
|
+ b = b || 0;
|
|
|
|
+ return a + b;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+alert(add(4,5,6))
|
|
|
|
+alert(add(4,5,6,7));
|
|
|
|
+```
|
|
|
|
+
|
|
|
|
+**Задание**
|
|
|
|
+
|
|
|
|
+Используя перебор массива `arguments` циклом `for`, сделайте функцию, которая складывает любое количество параметров
|
|
|
|
+
|
|
|
|
+### Возвращаемое значение
|
|
|
|
+
|
|
|
|
+Для возврата значения используется `return`. У него три основных свойства:
|
|
|
|
+- Собственно возврат значения во внешний код. Выражение после `return` *вычисляется в контексте функции*:
|
|
|
|
+```javascript
|
|
|
|
+debugger;
|
|
|
|
+function add(a,b)
|
|
|
|
+{
|
|
|
|
+ return a + b;
|
|
|
|
+}
|
|
|
|
+alert(add(3,4))
|
|
|
|
+```
|
|
|
|
+
|
|
|
|
+после чего *значение* попадает в место, где функция была вызвана (в `alert`)
|
|
|
|
+- Прекращение выполнения функции
|
|
|
|
+- `return` без параметра возвращает *ничего*, т. е. `undefined`:
|
|
|
|
+```javascript
|
|
|
|
+debugger;
|
|
|
|
+function bigAndWeirdFunction()
|
|
|
|
+{
|
|
|
|
+ var somethingBad = Math.random() > 0.5;
|
|
|
|
+ if (somethingBad){
|
|
|
|
+ alert("Something bad happens");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ alert("All OK!");
|
|
|
|
+}
|
|
|
|
+bigAndWeirdFunction();
|
|
|
|
+bigAndWeirdFunction();
|
|
|
|
+bigAndWeirdFunction();
|
|
|
|
+```
|