помогите понять
прочитал эту статью http://learn.javascript.ru/arguments
и заинтересовала возможность: Цитата:
но я не совсем понимаю как это работает, помогите ответить на пару возникших вопросов :
|
https://developer.mozilla.org/en/Jav.../Function/call
https://developer.mozilla.org/en/Jav...Function/apply Оба метода нужны для того чтобы явно задать контекст this при вызове функции. Это по сути одно и тоже, только в call аргументы передаются по одному через запятую, а в apply - массивом. Второе удобно использовать когда количество аргументов заранее неизвестно. |
Цитата:
а что насчет первого вопроса? |
Первый вопрос я не понял.
|
вот не совсем понимаю как работает данный код
var user = { log: function() { logService.add.apply(logService, arguments); } } var logService = { add: function() { alert( this.format(arguments) ); }, format: function(args) { return [].join.call(args, ' '); } } user.log("Вася", "сказал", "что-то умное.."); |
Цитата:
|
logService.add.apply(logService, arguments); что передается в logService ? в arguments я так понял псевдо массив arguments. но в add: function() { alert( this.format(arguments) ); }, передается arguments через this - вот тут я не пойму как это работает Цитата:
|
при вызове функции у нее есть скрытый аргумент arguments
тоесть function myfunc() { alert( arguments ); // тут массив переданных аргументов } myfunc( arg1, arg2 ); при вызове myfunc обычным образом ей передается в качестве контекста то что стоит слева от метода, в нашем случаем: myfunc(); не имеет ничего слева и по умолчанию функция получает контекст window в обычном режиме или null в строгом режиме. тоесть: function myfunc() { alert( this ); // window в обычном режиме, null в строгом режиме } И что бы функция получила нужный нам контекст, для этого есть два метода, особо сильно они не отличаются, например вызвать функцию и передать ей нужный контекст можно так: myfunc.call( "Я новый контекст", arg1, arg2 ); и при вызове мы получим: function myfunc() { alert( this ); // "Я новый контекст" alert( arguments ); // массив аргументов } другой метод apply отличается тем что в него не нужно передавать аргументы списком, а достаточно передать массив аргументов: myfunc.apply( "Я новый контекст", [ arg1, arg2 ] ); и при вызове мы получим тоже самое: function myfunc() { alert( this ); // "Я новый контекст" alert( arguments ); // массив аргументов } тоесть apply нам дает возможность вызвать функцию не зная точного количества аргументов, допустим мы перехватываем нашу функцию myfunc но мы не знаем сколько в нее аргументов должно придти function proxyMyfunc() { // делаем нужное действие // и вызываем оригинал myfunc.apply( this, arguments ); } |
спасибо за развернутый ответ.
чет голова плохо варит уже, пойду отдохну и вникну=) еще раз спасибо |
function proxyMyfunc() { // делаем нужное действие // и вызываем оригинал myfunc.apply( this, arguments ); } в данном случае передастся ссылка на обьект proxyMyfunc и псевдо массив arguments!? и в качестве this в myfunc будет использоваться обьект proxyMyfunc я правильно понял?=) |
Цитата:
|
Цитата:
function fnc (){ alert(this.t) } (function () { this.t = "ну и олень"; fnc.apply(this, arguments) }()); |
Цитата:
function fnc() { alert( "Наш контекст внутри функции fnc: " + this ); alert(this.t); } (function () { alert( "Наш контекст внутри безымянной функции: " + this ); this.t = "ну и олень"; fnc.apply( this, arguments ); }());Другой вариант: function fnc() { alert( "Наш контекст внутри функции fnc: " + this ); alert(this.t); } (function () { alert( "Наш контекст внутри безымянной функции: " + this ); var context = { t: "ну и олень" }; fnc.apply( context, arguments ); }()); |
Цитата:
var user = { log: function() { logService.add.apply(logService, arguments); } } var logService = { add: function() { alert( this.format(arguments) ); }, вместо this тут logService и вызывается его метод format ,а в качестве аргументов передаются аргументы переданные user.log format: function(args) { return [].join.call(args, ' '); } } user.log("Вася", "сказал", "что-то умное.."); |
Цитата:
|
Цитата:
|
еще один вопросик возник подскажите как устроен метод sort
смотрел тут но что то не нашел https://developer.mozilla.org/en/Jav...cts/Array/sort |
Цитата:
Точно сказать можно, только взглянув на исходный код этого метода. |
Цитата:
|
вот к примеру таже статья ссылку на которую я давал в начале поста, там приведен пример join
function join(separator) { if (!this.length) return ''; var str = this[0]; for (var i = 1; i<this.length; i++) { str += separator + this[i]; } return str; } или автор сам писал этот код исходя из спецификации? |
Цитата:
Удачи :) Код:
EncodedJSValue JSC_HOST_CALL arrayProtoFuncSort(ExecState* exec) |
спасибо это мне на долго :blink:
![]() |
Цитата:
Этот комментарий даёт наводку. Цитата:
Код:
template <class Item> |
я это хотел немного по другой причине узнать , а не сам алгоритм=)
document.getElementById("bt_Block").childNodes данный код возвращает object Nodelist и у меня возникла идея сделать так var obj = document.getElementById("bt_Block").childNodes; var s = [].sort; s.call.sort (obj, func); |
Цитата:
|
Цитата:
Это делается так var obj = document.getElementById("bt_Block").childNodes; obj = Array.prototype.slice.call(obj); |
Цитата:
|
я так понимаю такой фокус не прокатит избавить от текстовых узлов
<div class="bt_inp_Block" id="bt_Block" > <input type="text" class="inp_Out_color" value='выбор цвета >>' disabled="disabled" /> <input type="button" value="Color" class="start_Button" > </div> <script> function sortChild (obj){ if (obj.nodeType == 1)return obj; } var obj = document.getElementById("bt_Block").childNodes; obj = Array.prototype.slice.call(obj); alert(obj.sort(sortChild)) </script> |
<div class="bt_inp_Block" id="bt_Block" > <input type="text" class="inp_Out_color" value='выбор цвета >>' disabled="disabled" /> <input type="button" value="Color" class="start_Button" > </div> <script> function sortChild (obj){ if (obj.nodeType == 1) return true; return false } var obj = document.getElementById("bt_Block").childNodes; obj = Array.prototype.filter.call(obj, sortChild); alert(obj) </script> |
Цитата:
спс что помогаете=) |
продолжаю изучение по учебнику http://learn.javascript.ru и снова столкнулся с проблемой и вот в этой
http://learn.javascript.ru/using-closures статье есть задача для самостоятельного решения вот задача http://learn.javascript.ru/task/funk...trokovyj-bufer и все ок задачу решил он не сложная но сначала все работало , а потом вместо результат начало возвращать содержимое тела функции function makeBuffer() { var buff = ""; return function (param){ if(!param)return buff; buff += param; } } var buffer = makeBuffer(); // добавить значения к буферу buffer('Замыкания'); buffer(' Использовать'); buffer(' Нужно!'); // получить текущее значение alert(buffer); помогите понять почему так? |
function makeBuffer() { var buff = ""; return function (param){ if(!param)return buff; buff += param; } } var buffer = makeBuffer(); // добавить значения к буферу buffer('Замыкания'); buffer(' Использовать'); buffer(' Нужно!'); // получить текущее значение alert(buffer*!*()*/!*); |
Цитата:
|
и еще маленький вопрос
зачем в это коде function summ (a) { var summa = a ; function f(b){ summa += b; return f; }; f.toString = function() { return summa; }; return f; }; alert(summ (5)(3)(-8)) строчка f.toString = function() { return summa; }; и когда он срабатывает? |
Метод toString вызывается автоматически, когда необходимо привести объект к строке.
В данном случае alert(summ (5)(3)(-8)) - это сокращённая запись alert(summ (5)(3)(-8).toString()) |
Цитата:
|
дошел до последней главы функций и на удивление благодаря вашим подсказкам много нового узнал=)
но возник вопрос по последнему уроку Декораторы http://learn.javascript.ru/decorators вот к примеру есть код function work(a) { /* ... */ // work - произвольная функция, один аргумент } function makeLogging(f, log) { return function (a){ log.push(a); f.call(null,a); } } var log = []; work = makeLogging(work, log); work(1); // 1, добавлено в log work(5); // 5, добавлено в log for(var i=0; i<log.length; i++) { alert( 'Лог:' + log[i] ); // "Лог:1", затем "Лог:5" } в общем код просто но вот чего не могу понять return function (a){ log.push(a);// это понятно добавление в массив лог return f.call(null,a); // но смысел от этой сточки? и без нее работает } вот код решение задачи из учебника (выше это мое ришение) function work(a) { /*...*/ // work - произвольная функция, один аргумент } function makeLogging(f, log) { function wrapper(a) { log.push(a); return f.call(this, a); } return wrapper; } var log = []; work = makeLogging(work, log); work(1); // 1 work(5); // 5 for(var i=0; i<log.length; i++) { alert( 'Лог:' + log[i] ); // "Лог:1", затем "Лог:5" } |
Цитата:
|
Цитата:
но в данном примере нет смысла от нее так как функция пустая?=) |
Цитата:
Цитата:
|
Часовой пояс GMT +3, время: 03:25. |