Спасибо за пояснение.
Вышеуказанный код заработал, но я так и не смог разобраться чтоже в нем все-таки происходит. Особенно интересуют следующая часть кода 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]); |
мы не телепаты. Учитесь пользоваться консолью.
|
Да нет все работает. Просто я не понимаю принцип работы кода.
|
|
Да и от bind не мешало бы избавиться, т.к. тогда весь код не будет работать в ie8
|
Немного переделал так
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. |
Цитата:
Цитата:
Цитата:
кроме того, 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,
спасибо. Здесь https://developer.mozilla.org/en-US/.../Function/bind есть ещё костыль для bind (в разделе Compatibility). |
Большое всем спасибо, буду разбираться.
|
Интерестно, а foreach какие версии браузеров поддерживают?
|
Часовой пояс GMT +3, время: 14:12. |