Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
1 / 1 / 2
Регистрация: 20.10.2011
Сообщений: 154

Видимость функции

24.11.2014, 12:37. Показов 2055. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Товарищи, такая проблема. Только начал осваивать JS, раньше писал на C#. Начал с основ и немного просел на главе про функции.
Собственно, есть такой код:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function filter(arr, func) {
    var acceptArr = [];
    for ( var i = 0; i < arr.length; i++) {
      if(func(arr[i])) {
         acceptArr.push(arr[i]);
      }
    }
    return acceptArr;
  }
  
  function inBetween(a, b) {
    return function(x) {
      return x >= a && x <= b;
    }
  }
  
  function inArray(arr) {
    return function(x) {
      return arr.indexOf(x) != -1;
    }
  }
  
  var arr1 = [1, 2, 3, 4, 5, 6, 7];
 
  alert(filter(arr1, inBetween(3,6) ) );
Объясните популярно, как так получается, что в фильтр мы передаем функцию inBetween с двумя параметрами, в самом фильтре вызываем inBetween с одним параметром, который вообще оказывается параметром return function (и что это за конструкция такая).
Заранее благодарен

Добавлено через 1 час 31 минуту
С кодом выше, вроде, с горем пополам разобрался. Но вот эта штука для меня совершенно непонятная:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function makeBuffer() { 
  var buf = "";
  
   function buffer(txt) {
    if(txt === undefined)
      return buf;
    buf += txt;
  };
  
  buffer.clear = function() {
    buf = "";
  }
  
  return buffer;
};
 
var buffer = makeBuffer();
// добавить значения к буферу
buffer("Тест");
buffer(0);
buffer("Тебя не съест");
alert( buffer() );
buffer.clear();
// получить текущее значение
alert( buffer() ); // Замыкания Использовать Нужно!
Что здесь есть buffer, почему название функции внутри makeBuffer совпадает с названием переменной, в которую запихивают makeBuffer... Да и вообще, как ЭТО работает...
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.11.2014, 12:37
Ответы с готовыми решениями:

Видимость функции
Есть два файла: sript.js sript2.js В файле script.js я хочу использовать функцию, только если она пределена в script2.js ...

Видимость элементов
Здравствуйте,есть &lt;div id=&quot;div1&quot;&gt;&lt;/div&gt; .Внутри этого div таблица,несколько строк.В каждой строке первый столбец содержит чекбокс. ...

Видимость переменной
Добрый день! Скажите пожалуйста, почему переменная i в document.getElementById('new_upload_video'+i) остаёться i, а не подставляется цифра!...

5
не Администратор ^_^
 Аватар для Unick
988 / 223 / 23
Регистрация: 03.05.2009
Сообщений: 1,493
Записей в блоге: 1
24.11.2014, 13:44
Лучший ответ Сообщение было отмечено Fresh_MaN как решение

Решение

Fresh_MaN,
ну раз с первым разобрался
по поводу второго, постараюсь коротко и максимально понятно
Хотя я вижу, что задачу взял отсюда http://learn.javascript.ru/closures-usage , и судя по всему не внимательно читал учебник, раз не понял. Но все равно распишу, ибо сейчас надо отвлечься от работы.


js - это объекты. Весь js состоит из объектов, и кроме объектов в js ничего нету! запомни!
Если ты что-то создаешь глобально, это присваивается объекту window, если в функции - то переменная принадлежит объекту функции

JavaScript
1
2
3
4
5
6
var a = 3;
var b = 5;
function abc(){
 var a = 'hello';
 console.log(a, b); // 'hello', 5
}
если посмотреть на переменную а
window.a (или просто a) результат будет 3.

Но в функции дела обстоят иначе. Когда мы обращаемся к переменной а, то сначала проверяется существование переменной в объекте функции, и там а=='hello', переменной b не существует, тогда мы смотрим на уровень выше (это window), и там переменная существует, она равна 5
Поэтому a == 'hello', b==5; В функции мы можем обратиться напрямую к глобальному объекту window.a, он будет равен 3
Если в функции убрать var, тогда глобальная переменная a будет перезаписана.

Это называется область видимости переменных, работа с замыканиями. Надеюсь ты понял что buffer в функции и buffer в window - это разные переменные.

В твоем примере, ты присвоил в глобальную переменную buffer результат функции makeBuffer - объект (функция тоже объект). Функция makeBuffer исполнилась, создалась локальная видимость (замыкание).
Поэтому window.buffer стал функцией, которая имеет доступ к замыканию makeBuffer, и никто больше не имеет туда доступа;

Другой пример:
JavaScript
1
2
3
4
5
6
7
8
9
10
var abc = (function(){
 var a = 0; 
 return function(){
  return ++a;
 } 
})();
 
abc();
abc();
abc();
Ты объявил переменную abc, ей присвоил результат функции. Это значит функция исполнилась, внутри нее объявилась переменная a, и вернула функцию (у которой есть доступ к переменной a)
1
 Аватар для whiteapps
414 / 379 / 220
Регистрация: 18.07.2014
Сообщений: 1,259
24.11.2014, 13:57
Fresh_MaN,
Цитата Сообщение от Fresh_MaN Посмотреть сообщение
почему название функции внутри makeBuffer совпадает с названием переменной, в которую запихивают makeBuffer
безразлично как называется ф-ция внутри makeBuffer и переменная в которую передается результат этой ф-ции
это разные области видимости

а область видимости в js определяется только ф-цией

JavaScript
1
2
3
4
5
6
7
8
9
10
var x; // глобально
function f() { 
  // область видимости ф-ции
 x = 1; //запись в глобальную переменную
 var y = 1; //создаем локальную переменную, т.к. есть служебное слово var
function z () { } // создаем локально ф-цию z
};
console.log(z);// ошибка, z не определена, т.к. в глобальном скопе не видная ф-ция z объявленная в f() 
var z = "ёпрст"; // глобальная переменная
console.log(z); // вывод: ёпрст
1
1 / 1 / 2
Регистрация: 20.10.2011
Сообщений: 154
24.11.2014, 14:37  [ТС]
Спасибо! Почти все встало на свои места. Только один вопрос остался:
строчка с buffer.clear в window...
Почему мы обращаемся к этой функции не buffer.buffer.clear()?
0
не Администратор ^_^
 Аватар для Unick
988 / 223 / 23
Регистрация: 03.05.2009
Сообщений: 1,493
Записей в блоге: 1
24.11.2014, 16:53
Fresh_MaN,
JavaScript
1
2
var a = (function(){ var a=1; return a;})();
var b = (function(){ var b = {a:2, b:3}; return b;})()
В первом случае функция вернет примитив. А значит a==1 (а не a.a == 1, все потому что мы возвращаем не имя переменной... или не знаю какая логика у buffer.buffer)
Во втором случае мы возвращаем объект {a:2, b:3}
а значит мы можем обратиться к b.a==2 и b.b==3

Так же, как я писал выше, не следует забывать, что функция тоже объект
а значит мы можем присвоить свойства
JavaScript
1
2
3
4
5
6
7
8
9
10
11
// 1
var a = {}; // object
a.a = 1;
a.b = function(){alert('hello');}
 
// 2
function b(){ // function
alert('function b');
}
b.a = 1;
b.b = function(){alert('hello');}
1. Если обратимся к a, то нам выведет объект {a:1, b: function}
a.a == 1
a.b() - результат функции

2. Если обратимся к b(), то нам выведет результат функции
b.a и b.b аналогично первому варианту
1
1 / 1 / 2
Регистрация: 20.10.2011
Сообщений: 154
25.11.2014, 06:08  [ТС]
Спасибо. Теперь все точно стало понятно!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.11.2014, 06:08
Помогаю со студенческими работами здесь

Видимость переменных
Ребята подскажите как правильно передать значение переменной data в переменную id_pole чтобы вывести ее значение за пределами функции? ...

видимость картинки
Есть небольшой скрипт. Мне нужно, чтобы сделать скрипт, в котором при значении текстового поля больше 31 картинка на странице становится...

Ajax. Видимость XMLHttpRequest.
Вот имеется функция обработчик onclick кнопки на странице: function getData() { var XMLHttpRequestObject = new XMLHttpRequest(); ...

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

Видимость блоков, как лучше организовать
Есть блоки: &lt;div name=&quot;vhod&quot; id=&quot;vhod&quot;&gt; &lt;form ...&gt; ... &lt;input type=&quot;text&quot;... id=&quot;log1&quot; name=&quot;log1&quot;&gt; ... ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru