Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Объясните, почему функция работает именно так. (https://javascript.ru/forum/misc/31048-obyasnite-pochemu-funkciya-rabotaet-imenno-tak.html)

Kivi 02.09.2012 02:39

Цитата:

Сообщение от nerv_ (Сообщение 202451)
Kivi, думаю, тебе стоит почитать про замыкания.

Учу Javascript по учебнику этого сайта, иду по порядку. Все нормально, но вот в этом месте зацепился за эту перезапись ссылочной переменной.
Но уже разобрался, зацените.
Я думал, что каждый раз, когда происходит что-то подобное:
15	alert( sum(1,2) ); // 6
16	alert( sum(2,3) ); // 10

интерпретатор проходит весь скрипт сначала, а тут ссылка уже указывает на другую функцию (объект). Но теперь понял, что сформируется уже другая функция и будет вызываться "модифицированная" doublingDecorator.

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

Kivi 02.09.2012 20:28

Вот еще хрень.
Источник комментарий на habrahabr.ru
var y = 5;
 var x = function(){
     return y;
 };
 var z = function(t){
     var y = 10;
     return t();
 }
 z(x);

Почему в строке 7 return t();?
Что это значит?
Где можно об этом прочитать?

nerv_ 02.09.2012 21:13

Цитата:

Сообщение от Kivi
Почему в строке 7 return t();?
Что это значит?
Где можно об этом прочитать?

смотри внимательней: у тебя есть
1. y - number
2. x - function
3. z - function

z(x); -> вызывается функция z, в которую в качестве аргумента передается другая фунция (x), имя которой (имя аргумента) задается как t.

Лучше скажи, почему y = 5 :)

var y = 5;
 var x = function(){
     return y;
 };
 var z = function(t){
     var y = 10;
     return t();
 }
 alert( z(x) );

Kivi 03.09.2012 00:18

По-моему у в
3 return y; - есть window.y=5,
а в
6 var y = 10; - это function Lexical Environment.
Сначала х(), а потом уже t(), используют window.y=5.

На этом примере, можешь показать как ты анализируешь области видимости. Так как это было (дословно), когда просматривал этот код, используешь ли какие-то наборы правил типа этих для this (в разделе "Теория").
Может схемку какую рисуешь?

nerv_ 03.09.2012 00:34

Цитата:

Сообщение от Kivi
как ты анализируешь области видимости

Также, как и все :)
// 1

function() {
	// 2
	
	function() {
		// 3
	
	}
}

Достаточно запомнить одно:

Дэвид Флэнаган:
Цитата:

Функции в JavaScript имеют не динамическую, а лексическую область видимости. Это означает, что они исполняются в области видимости, которая была создана на момент определения функции, а не на момент ее исполнения.

Kivi 03.09.2012 01:16

Встречал где-нибдь описание такого
var some_function = new Function('console.log(my_var)'); (именно 'console.log(my_var)') ?
Источник - комментарий на habrahabr.ru

nerv_ 03.09.2012 01:29

Цитата:

Сообщение от Kivi
Встречал где-нибдь описание такого
var some_function = new Function('console.log(my_var)'); (именно 'console.log(my_var)') ?

именно 'console.log(my_var)'? Нет, не встречал :D

конструктор Function
[[Scope]] для new Function

Kivi 03.09.2012 15:56

Дэвид Флэнаган:

Инструкция return может также использоваться без выражения, тогда она про
сто прерывает исполнение функции, не возвращая значение. Например:

function display_object(obj) {
[I]    // Сначала убедимся в корректности нашего аргумента
    // В случае некорректности пропускаем остаток функции[/I]
    if (obj == null) return;
[I]    // Здесь находится оставшаяся часть функции...[/I]
}


И еще пример

function foo() { 
    if (false) { 
        var x = 1; 
    } 
    return; 
    var y = 1; 
}

Вопрос:
Почему return не в конце?
Если поменять местами строки 5 и 6 что-то изменится?

nerv_ 04.09.2012 00:05

Цитата:

Сообщение от Kivi
Почему return не в конце?

потому, что выполнение функции можно прервать в любом месте.

Цитата:

Сообщение от Kivi
Если поменять местами строки 5 и 6 что-то изменится?

а это мне ты скажи :)

Kivi 04.09.2012 01:31

Для возврата значения используется директива return. Она может находиться в любом месте функции.
Как только до нее доходит управление — функция завершается и значение передается обратно.


Есть совет как быть внимательнее, отличный от "Будь внимательнее!" ?:)


Часовой пояс GMT +3, время: 12:13.