ソースを参照

05 return again

me@helium 8 年 前
コミット
244b79024d
1 ファイル変更129 行追加6 行削除
  1. 129 6
      05.md

+ 129 - 6
05.md

@@ -68,7 +68,12 @@ function d()
 {
     debugger;
 }
+alert("before d");
+d()
+alert("after d");
+d()
 ```
+Для входа и выхода из функции используются `F11` и `Shift-F11` в **Developer Tools** при **пошаговой отладке**
 
 - **Область видимости**. Так как функция не может "знать", из какого контекста она вызывается, то нет возможности знать заранее, совпадают ли имена
   переменных в функции и вне её. Таким образом вероятны *побочные эффекты* - непредсказуемые изменения переменных во внешнем коде, которые могут
@@ -78,9 +83,9 @@ function d()
 var surname = "Петров";
 function readSurname()
 {
-    surname    = prompt("Введите фамилию","")
+    surname = prompt("Введите фамилию","")
     if (surname === null || surname === ""){
-        surname    = "Иванов"
+        surname = "Иванов"
     }
 }
 
@@ -98,9 +103,9 @@ alert(surname);
 var surname = "Петров";
 function readSurname()
 {
-    var surname    = prompt("Введите фамилию","")
+    var surname = prompt("Введите фамилию","") // ТУТ
     if (surname === null || surname === ""){
-        surname    = "Иванов"
+        surname = "Иванов"
     }
 }
 alert(surname);
@@ -117,7 +122,7 @@ function readWithDefault(promptText, promptDefault, somethingDefault)
 {
     var something = prompt(promptText,promptDefault)
     if (something === null || something === ""){
-        something    = somethingDefault;
+        something = somethingDefault;
     }
     alert("something: " + something);
 }
@@ -134,7 +139,7 @@ function readWithDefault(promptText, promptDefault, somethingDefault)
 {
     var something = prompt(promptText,promptDefault)
     if (something === null || something === ""){
-        something    = somethingDefault;
+        something = somethingDefault;
     }
     return something;
 }
@@ -142,3 +147,121 @@ alert(surname);
 var name = readWithDefault("Введите имя","","Иван");
 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();
+```