Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замыкание не является конструктором 
V
    Опции темы
Innuendo108
Дата 6.6.2010, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 3.4.2008

Репутация: нет
Всего: 2



Прочитал недавно про замыкания, узнал про одно из его свойств - инкапсуляция.

Есть задача, обработать строку. Упростим задачу до обрамление строки символами решетки.
Следующий код работает:
Код

var obj = (function() {
    // переменные
    var sin = ""; // входная строка
    var sout = ""; // выходная строка
    
    function convert(){
        sout = "#" + sin + "#";
    };
    
    return {
        
        setSettings: function(str) {
            sin = str;
        },
        
        convert : function() {
            convert();
        },
        
        getResponce : function() {
            return sout;
        }
    }
})();

window.onload = function() {
t = "TEST";
obj.setSettings(t);
obj.convert();
alert(obj.getResponce); // #TEST#
}


Однако настоящая задача по-сложнее, и там необходима рекурсия.
Допустим обрамлять надо всю строку, а так же выражения в скобках.
т.е. "qu(test)qu" вернет "#qu(#test#)qu#";

тут я решил делать для каждого преобразования свой экземпляр объекта..
но такой код:
Код

o = new obj(); // неа =(

не работает.

Я так понимаю, я не правильно использую это, или как?

Это сообщение отредактировал(а) Innuendo108 - 6.6.2010, 07:59
PM MAIL   Вверх
ksnk
Дата 6.6.2010, 08:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Innuendo108, замыкание - это просто такая фенечка нетривиальная в JS. Проявляется она когда одна функция описывается в теле другой. При этом внутренней функции становятся доступны все внутренние переменные внешней, даже если эта внутренняя функция вызывается совсем даже непонятно где и непонятно когда ;) Это если совсем уж на пальцах объяснять.

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Innuendo108
Дата 6.6.2010, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 3.4.2008

Репутация: нет
Всего: 2



ksnk
да, замыкание в основном основывается на вызове функции в теле другой. Это нужно, к примеру, для назначения событий элементам в цикле (с переменным аргументом).

Но так же используют и просто в виде var f = (func(){})(); Я чисто вижу такую конструкцию в пользовательских скриптах .user.js и скриптах из расширений к браузеру....  Это делают для инкапсуляции. Мне именно для пользовательского скрипта и нужно... Поправьте если я не прав, мне желательно использовать такую конструкцию?
PM MAIL   Вверх
ksnk
Дата 6.6.2010, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



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

если написать , например так
Код

var obj_func = function() {
    // переменные
...
  return {
  ...
  }
}
...
var obj_1=obj_func();
obj.setSettings("TEST";
obj.convert();
var obj_2=obj_func();
obj.setSettings("TEST1";
obj.convert();
...


Это сообщение отредактировал(а) ksnk - 6.6.2010, 11:08


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Innuendo108
Дата 6.6.2010, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 3.4.2008

Репутация: нет
Всего: 2



ок, понял. Вот так и обрамлю.. целиком весь скрипт тогда и обрамлю
PM MAIL   Вверх
InfMag
Дата 9.6.2010, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 21.11.2004

Репутация: 2
Всего: 4



Цитата(Innuendo108)
но такой код:
Выделить всёкод Javascript
1:
    
Код
o = new obj(); // неа =(


не работает.


Вот пара способов как правильно создать объект (p.s. JS чувствителен к регистру)
Код

var obj = new Object()
var obj = {}

Хотя если быть честным - можно создать как угодно, ибо в JS всё - объекты.

по поводу f = (func(){})(); - f в итоге это не функция, а её результат var STR = (function(){return "text"})() вернёт строку с text

Код

sin.replace(/\(([^\0]*?)\)/g, '(#$1#)') // вроде так

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0831 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.