Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #31 (permalink)  
Старый 27.08.2012, 21:48
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Спасибо за пояснение.

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

Особенно интересуют следующая часть кода
function f(callback) {
    Array.prototype.forEach.call(elements, callback);
    return this;
  }
  for (var method in result)
    result[method]=f.bind(result, result[method]);



Больше всего мне непонятно, что же происходит здесь, и как после всего этого выглядит result в итоге
for (var method in result)
    result[method]=f.bind(result, result[method]);
Ответить с цитированием
  #32 (permalink)  
Старый 27.08.2012, 21:50
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

мы не телепаты. Учитесь пользоваться консолью.
Ответить с цитированием
  #33 (permalink)  
Старый 27.08.2012, 21:54
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Да нет все работает. Просто я не понимаю принцип работы кода.
Ответить с цитированием
  #34 (permalink)  
Старый 27.08.2012, 21:57
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

http://es5.javascript.ru/x15.3.html#x15.3.4.5
Ответить с цитированием
  #35 (permalink)  
Старый 27.08.2012, 21:57
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Да и от bind не мешало бы избавиться, т.к. тогда весь код не будет работать в ie8
Ответить с цитированием
  #36 (permalink)  
Старый 28.08.2012, 13:03
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Немного переделал так
var topmenu= (function(window) {
  var elements = [];
  var result={
    functio: function () {
      alert(arguments[0].innerHTML);
    }
  };
  function f(callback) {
   
    elements.forEach(callback);
	
    return this;
  }
  
  for (var method in result)
    result[method]=f.bind(result, result[method]);
	
  result.Sattr=function(name)
                {
                try{ elements = Array.prototype.slice.apply(document.querySelectorAll(name));}catch(e){}
                   
                    return this;
                };
  return result;
}(window));
topmenu.Sattr("div").functio().functio();


Сложнее всего до моего понимания доходит эта строка

for (var method in result) result[method]=f.bind(result, result[method]);

Насколько я понимаю,
1) мы передаем текущий объект в функцию f
2) в ней через foreach применяем к каждому отдельному элементу массива callback, которым является каждый метод текущего объекта т.е. result[method]

При этом мне вовсе не яcно, как функция вообще получает elements. Т.к. попытка вызвать его вне метода не дает результата.

Т.е. если перед циклом for поставить alert(elements.length); толку не будет.

Что как бы говорит о том, что все указанные действия вне методов вызываются либо сразу, либо при каждом обращении к объекту через его метод.

Кроме прочего насколько я понимаю bind - это своего рода внутренняя функция, которую можно повторить и в устаревших браузерах.

В общем, второй день сижу, пытаясь разобраться, что да как, запутался уже. Помогите, пожалуйста, разобраться, и заодно симулировать bind.
Ответить с цитированием
  #37 (permalink)  
Старый 28.08.2012, 15:59
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от platedz
1) мы передаем текущий объект в функцию f
текущий объект - это this. а в коде передаётся result.

Сообщение от platedz
При этом мне вовсе не яcно, как функция вообще получает elements. Т.к. попытка вызвать его вне метода не дает результата.
посредством замыкания.

Сообщение от platedz
Кроме прочего насколько я понимаю bind - это своего рода внутренняя функция, которую можно повторить и в устаревших браузерах.
функция, которая имеет примерно такой код (словами объяснять долго):

кроме того, bind имеет некоторые особенности, которые не реализуемы посредством JavaScript (другими словами, полного костыля не получится создать.).. об особенностях посмотрите в интернете.
/*  ----------  ОПИСАНИЕ  ---------- */

Function.prototype._bind = function (context /*, arg0, arg1, ... argN */) {
    
    // сохраним переданные аргументы в замыкании. Именно "1", потому что нулевой элемент - контекст.
    var args = Array.prototype.slice.call(arguments, 1);

    // сохраним текущую функцию в замыкании, ибо ...
    var func = this; 

    // ... в этой функции this уже будет window (по-умолчанию, во всех функциях так).    
    return function () {

        // преобразуем объект текущих аргументов в массив
        var newArgs = Array.prototype.slice.call(arguments);

        // добавим к переданным вначале аргументам переданные сейчас.
        newArgs = args.concat(newArgs);

        // и вызовем apply, передав контекст, и аргументы.
        func.apply( context, newArgs );

    };
};

/*  ----------  ТЕСТИРОВАНИЕ  ---------- */

// функция просто выведет алертом свойство "FOO" своего контекста, добавив к нему первый аргумент, и второй.
// this сейчас равен window (по-умолчанию).
var test = function (first, second) {  alert( this.FOO + first + second );  };

// объект со свойством "FOO"
var obj = {  "FOO": "Hello" };

// применим связывание.
// this в test_binded будет равен obj.
// а первый аргумент ( first в функции "test" ) будет равен строке ", "
var test_binded = test._bind( obj, ", " );

// вызовем связанную функцию, передав ей ещё один аргумент ( это уже будет "second" )
test_binded( "World!" );

// Связывание и вызов связанной функции аналогичны этой строке :
test.call( obj, ", ", "World!" );

Последний раз редактировалось melky, 28.08.2012 в 16:03.
Ответить с цитированием
  #38 (permalink)  
Старый 28.08.2012, 20:47
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

melky,
спасибо. Здесь https://developer.mozilla.org/en-US/.../Function/bind есть ещё костыль для bind (в разделе Compatibility).
Ответить с цитированием
  #39 (permalink)  
Старый 28.08.2012, 22:04
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Большое всем спасибо, буду разбираться.
Ответить с цитированием
  #40 (permalink)  
Старый 02.09.2012, 21:56
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Интерестно, а foreach какие версии браузеров поддерживают?

Последний раз редактировалось platedz, 02.09.2012 в 23:10.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Записать в массив все id дочерних эжементов Alexxiss Общие вопросы Javascript 1 18.08.2012 14:03
Название ячейки таблицы Questioner Общие вопросы Javascript 6 16.02.2011 09:58
Как применить css ко всем элементам внутри блока MaxB jQuery 12 28.05.2010 07:56
как записать id всех элементов в массив? SunYang Общие вопросы Javascript 21 06.02.2010 22:50
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37