помогите понять
прочитал эту статью 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, время: 18:27. |