Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
69 / 69 / 22
Регистрация: 06.06.2013
Сообщений: 404

сюда буду скидывать все интересующие меня тонкости, которые будут возникать по мере изучения JavaScript

10.08.2013, 14:36. Показов 1057. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как мы знаем функция обертка
JavaScript
1
(function(){ переменные }())
может служить для того, чтобы создать блок переменных, которые будут использоваться только внутри неё, и не будут конфликтовать с другими переменными в коде.
Как я понял, это делается для модулей, имена переменных которых, могут совпадать с вашими собственными.
Так вот хотелось бы знать, зачем мы оборачиваем
JavaScript
1
function() {}
JavaScript
1
()
и зачем делаем её вызов в конце
JavaScript
1
()
Зачем это?

Так же второй вопрос: как получить доступ, к функции внутри функции?
Скажем есть функция:
JavaScript
1
var z = 10; function f() { var val = z -10; function f1(x) { return x*x; } return val; }
Как мне получить доступ к функции f1?
К примеру если функция является свойством объекта, то можно вызвать её как метод:
JavaScript
1
f.f1();
А как поступать в данном случае? Логично было бы
JavaScript
1
f(f1(значение));
, но не работает... Как правильно? И вообще, можно ли это так делать то?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.08.2013, 14:36
Ответы с готовыми решениями:

Как создавать файлы, которые будут подгружаться по мере обращения к ним?
У меня приложение занимает 120 kb, при том что программа в целом будет весить не более 800 kb, и вообще я хотел бы знать как создавать...

У меня все никак не получается найти ошибку в коде( Буду признателен, если поможете!
Вот задание: Составить программу на С++ для вычисления указанных математических функций. Аргумент х вводится с консоли, константы ...

Необходимо определить переменную которой по мере работы кода я буду присваивать разные классы
Добрый день, столкнулся с такой проблемой. Необходимо определить переменную которой по мере работы кода я буду присваивать разные...

13
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
10.08.2013, 17:41
1. вы не поняли сути "обёртки"
определение функции - это декларативный код, интерпретатором не выполняющийся
чтобы запустить эту функцию (и исполнить код, внутри неё написанный), надо прописать имя этой функции и добавить к ней пару круглых скобок

в любом случае имя этой функции остаётся свойством объекта window
и только оно одно, а не выдуманный вами какой-то "блок переменных"

вот чтобы даже это одно имя функции не конфликтовало с другими кодами (вдруг какой-то ещё код использует такое же имя для своей глобальной переменной), и придумана "обёртка", которая запускает на исполнение безымянную функцию

т.е. два кода сделают одно и то же:
function myFunc () {alert (123)}; myFunc ();
и
(function () {alert (123)}) ();

но в первом случае у окна останется свойство-функция myFunc, и в этом всегда можно удостовериться, запустив alert (typeof myFunc);
а во втором случае - вообще ничего не останется... "чёрный ящик" сделал свою работу и исчез... испарился
--------

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

в общем, вы сначала сами отрезаете себе руки по локоть, а затем идёте в музыкальную школу, чтобы вас научили играть на фортепиано

Не по теме:

хотя вполне могут и научить, вот так, например - http://www.youtube.com/watch?v=rVKj91uLcYc

1
69 / 69 / 22
Регистрация: 06.06.2013
Сообщений: 404
10.08.2013, 18:28  [ТС]
Спасибо большой, я думал все намного сложнее) думал это независимый массив кода имеющий доступ к любой переменной в его теле, но для этого лучше использовать массивы) просто в книжке все чересчур завертели

Добавлено через 12 минут
По поводу второго вопроса и вправду, зачем это?) проще использовать те же объекты, или массивы)
Думал все круче, допустим для того чтобы выполнить следующее выражение 3*6+6/9 мы могли бы записать:
JavaScript
1
function f() { function arguments[0](x,y) { return x*y; }; function arguments[1](x,y) { return x/y; }; return arguments[0]+arguments[1]; }
и сократить стандартный код вызова до скажем:
JavaScript
1
f((3,6),(6,9))
- скажем как-то так, хотя вызовы неправильный вижу уже)
0
69 / 69 / 22
Регистрация: 06.06.2013
Сообщений: 404
11.08.2013, 21:02  [ТС]
Объясните пожалуйста, почему:
JavaScript
1
2
3
4
5
6
>>> var add = (function(){ var n=0; return function() {return n++;} }())
undefined
>>> add()
0
>>> add()
1>>>
Работает.


А
JavaScript
1
2
3
4
5
6
7
8
>>> function add(){ var n=0; return function() {return n++;} }
undefined
>>> add()
function() {return n++;}>>>
>>> add()()
0
>>> add()()
0>>>
Нет.

Добавлено через 41 минуту
Что такое объект вызова?

Добавлено через 1 час 43 минуты
В первой функции меняется значение, потому что переменную тела замыкания, мы сохраняем в переменной. А соответственно, она существует.

Во втором же примере, она никуда не сохраняется. А все данные о ней просто подчищаются? То есть новые ей хранить, фактически некуда.
Но если мы присвоим её переменной, то кеш появится. И туда будет сливаться вся информация, касающаяся переменной тела замыкания.
Проверим:
JavaScript
1
2
3
4
5
6
>>> var a = function add(){ var n=0; return function() {return n++;} }
undefined
>>> a()()
0
>>> a()()
0>>>
Мой мозг скоро вскипит О_О
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
12.08.2013, 00:37
Есть такое удобное понятие — отложное вычисление. Это когда значение функции вычисляется не тогда, когда сама функция описана.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> var a = function add(){ var n=0; return function() {return n++;} }
// a и add одно и то же
undefined
// потому что это statement, действие
>>> a()()
0
// создали счетчик, его первое значение 0
>>> a()()
0
// создали другой счётчик, его первое значение тоже 0
>>> var b = a()
undefined
>>> b()
0
// аналогично
>>> b()
1
// это тот же (!) счётчик, а потому он увеличивается
А ещё попробуйте так:
JavaScript
1
2
3
4
5
6
7
8
function add(){ var n=0; return function() {return n++;} }
var a1 = add();
var a2 = add();
a1(); // 0
a1(); // 1
a2(); // 0
a1(); // 2
a2(); // 1
1
69 / 69 / 22
Регистрация: 06.06.2013
Сообщений: 404
12.08.2013, 01:48  [ТС]
JavaScript
1
2
3
4
5
a1(); // 0
a1(); // 1
a2(); // 0
a1(); // 2
a2(); // 1
Где хранятся эти значения 2 1? Куда производится запись? Если в локальную переменную, тогда код
JavaScript
1
2
3
4
5
6
7
8
function add(){ var n=0; return function() {return n++;} }
var a1 = add();
var a2 = add();
a1(); // 0
a1(); // 1
a2(); // 0
a1(); // 2
a2(); // 1
эквивалентен

JavaScript
1
2
3
4
5
6
7
var a1 = (function(){ var n=0; return function() {return n++;} };());
var a2 = (function(){ var n=0; return function() {return n++;} };());
a1(); // 0
a1(); // 1
a2(); // 0
a1(); // 2
a2(); // 1
Я правильно понимаю?

Добавлено через 10 минут
Мы определили локальную переменную один раз, передав переменной a1 и a2 её значение 0, потом запустили счетчик.
А если мы пишем так add()(); то запускаем сначала функцию обертку, которая каждый раз определяет переменную n которая равна 0, а потом уже запускает счетчик.
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
12.08.2013, 11:38
Я себе это представляю таким образом:
Есть функция, это объект, который может храниться в некоторой переменной.
Грубо говоря,
JavaScript
1
2
function add(){...}
var add = function(){...}
это одно и то же (есть разница в порядке инициализации, но к теме это имеет косвенное отношение).
Есть применение функции к списку аргументов, которая в JS обозначается скобочками: f(), f(x), f(x,y), ... притом f — это функция (как объект), а потому в тексте это может быть не только функция, которая определена непосредстенно, но и функция, получаемая при вычислении. Грубо говоря,
JavaScript
1
2
{ f: function(x){alert(x+2)} }.f(1);
(function(x){alert(x+2)})(1);
эквивалентны (разница в значении this, которое не используется здесь) потому, что сначала вычислится {f:function(){alert(x+2)}}.f, которое равняется function(x){alert(x+2)}, а затем эта функция вызовется на аргументе 1. Другой пример:
JavaScript
1
2
3
function add(){ var n=0; return function() {return n++;} }
var a = add(); // это одна функция
var b = add(); // это другая функция (как объект)
Объект исполнения
При вызове функции происходит следующее:
1. сначала создаются объект arguments, который содержит информацию о выз. функции, его аргументах и т.п.
2. создаётся пустой объект scope.
3. в scope добавляются свойства this, arguments, все именованые аргументы, а также все имена функций, которые объявляются через function <name>(..){...} (есть нюанс), и все имена переменных, объявленные через var (есть нюанс).
Когда Вы пишите имя переменной внутри функции, например,
JavaScript
1
2
3
4
5
function f(obj) {
  var x=2;
  function add(y) { return x+y; }
  obj.value = add(1);
}
интерпретатор как бы смотрит на это так:
JavaScript
1
2
3
4
5
function f(obj) {
  var scope = {obj: obj, x: undefined, add: function(y){ var scope1 = {y:y}; return scope1.y+scope.x;} }
  scope.x = 2;
  scope.obj.value = scope.add(1);
}
поэтому когда Вы дважды вызываете Ваш метод add, создаются два разных объекта scope, и внутренние функции, которые возвращаются наружу в a1 и a2, ссылаются на разные объекты scope.
Кстати, я говорил о нюансе, так вот посмотрите на порядок, в котором в коде выше add и x принимают свои значения. Функции (через function) сразу принимают свои значения, а переменные (через var) — только в порядке очереди.

Подробнее см. http://javascript.ru/ecma/part10#a-10

Я не советую Вам рассуждать так, как Вы рассуждаете, потому что n внутри a1 — это другая n, по сравнению с онной внутри a2.
Ваши рассуждения об эквивалентности var a1 = (function(){...}()), a2 = (function(){...}()) и var a1 = add(), a2 = add() лучше проводить осторожно, потому что при трёх уровнях вложенности функций (а у нас два уровня) эти рассуждения могут не выполняться.
1
69 / 69 / 22
Регистрация: 06.06.2013
Сообщений: 404
12.08.2013, 16:21  [ТС]
"потому что n внутри a1 — это другая n, по сравнению с онной внутри a2."

Нет я согласен, это клон.
0
69 / 69 / 22
Регистрация: 06.06.2013
Сообщений: 404
14.08.2013, 00:53  [ТС]
Подскажите что-нибудь по теме "обезьянья заплатка"
0
69 / 69 / 22
Регистрация: 06.06.2013
Сообщений: 404
17.08.2013, 19:24  [ТС]
кто может помочь отладить код?
нужно чтобы функция создавала массив из 100 чисел от 1 до 100 разбросанных в произвольном порядке
помогите отладить код, как только натыкается на уже имеющееся число выходит из функции
просьба не писать свой код, просто скажите где ошибка
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var bool = false;
mass = [];
function rand(){
    var numb = Math.floor(Math.random()*100);
    for(i=0;i<=mass.length;i++){
        if(mass[i]===numb){ return bool = true; }
        else bool = false;
    }
    if(bool === false && mass.length !== 100){
        mass.push(numb)
        arguments.callee();
    }
    else if(bool === true && mass.length !== 100) arguments.callee();
    else return mass;
};
Добавлено через 35 минут
при вызове вручную работает
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
>>> mass
Array [22, 93, 46]
>>> rand()
undefined
>>> mass
Array [22, 93, 46, 48, 71, 55, 21, 78, 13, 63, 20, 60, 3, 45, 98]
>>> rand()
undefined
>>> mass
Array [22, 93, 46, 48, 71, 55, 21, 78, 13, 63, 20, 60, 3, 45, 98, 12, 70, 41, 23, 85]
>>> rand()
undefined
>>> mass
Array [22, 93, 46, 48, 71, 55, 21, 78, 13, 63, 20, 60, 3, 45, 98, 12, 70, 41, 23, 85, 5, 26, 56]
>>> rand()
undefined
>>> mass
Array [22, 93, 46, 48, 71, 55, 21, 78, 13, 63, 20, 60, 3, 45, 98, 12, 70, 41, 23, 85, 5, 26, 56, 6, 10]
>>> rand()
undefined
>>> mass
Array [22, 93, 46, 48, 71, 55, 21, 78, 13, 63, 20, 60, 3, 45, 98, 12, 70, 41, 23, 85, 5, 26, 56, 6, 10, 50, 95, 52, 97]>>>
Добавлено через 11 минут
vxfdf

Добавлено через 23 минуты
порядочек
JavaScript
1
2
3
4
5
6
7
8
mass = [];
function rand(){
    var numb = Math.floor(Math.random()*100);
    for(i=0;i<=mass.length;i++){
     if(mass.length !== 100 && mass[i]===numb){ return arguments.callee(); }
     else if(mass.length !== 100) { mass.push(numb); arguments.callee(); }
    }
};
только не могу понять, почему не принимает массив как аргумент
и как проверять скорость функции
0
69 / 69 / 22
Регистрация: 06.06.2013
Сообщений: 404
31.08.2013, 13:49  [ТС]
Ребята, а что такое /*{+*,}] - такие конструкции, где про них почитать?

Добавлено через 14 минут
И еще, ребят, объясните область применения классов, я конечно понимаю что можно создавать всякие модули, но для меня это пока слишком громоздко.
Не могли бы вы объяснить мне на более практичном примере, преимущества их использования, и, возможно, сферу применения.
0
 Аватар для vovandr
636 / 523 / 195
Регистрация: 19.08.2013
Сообщений: 1,400
31.08.2013, 14:15
Вместо callee() юзайте именнованные функциональные выражения (NFE). Метод callee() уже в deprecated.
1
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
31.08.2013, 18:36
Цитата Сообщение от vooduq Посмотреть сообщение
что такое /*{+*,}] - такие конструкции, где про них почитать?
регулярные выражения
читать - где угодно, где найдёте "регулярные выражения javascript"
1
01.09.2013, 07:17
 Комментарий модератора 
vooduq, Один вопрос - одна тема. Не нужно хламить мульён вопросов в одной куче.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.09.2013, 07:17
Помогаю со студенческими работами здесь

стоит оперативка на 2гб, если я докуплю ещё одну на 2гб, будут ли у меня поддерживаться все 4?
На данный момент у меня стоит оперативка на 2гб, если я докуплю ещё одну на 2гб, будут ли у меня поддерживаться все 4? win xp(x32) Если нет...

Получить в другом файле g все компоненты файла f, которые будут их квадратами
помогите с задачей, &quot;известный файл f, компоненты которого целые числа, Получить в другом файле g все компоненты файла f , которые будут их...

Вывести на экран все трехзначные числа, которые будут делится на 4 и 6, оканчивающиеся на 8
Вывести на экран все трехзначные числа, которые будут делится одновременно без остатка на 4 и 6, оканчивающаяся на 8

Вывести на страницу все фотографии, которые будут добавляться в админке к данному объекту
добрый день всем! models.py: сlass PortfolioObject(models.Model): address = models.CharField(max_length=50, null=True,...

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru