Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   apply и call. В чём отличия? (https://javascript.ru/forum/offtopic/5156-apply-i-call-v-chjom-otlichiya.html)

B~Vladi 21.09.2009 11:16

apply и call. В чём отличия?
 
Читал стандарт языка, но ответа не нашел... Заметил, только что в call можно передавать много аргументов... Если есть ещё какие-нибудь отличия - напишите пжлст пример, где их можно посмотреть. Спс:)

B~Vladi 21.09.2009 11:19

А и ещё один вопрос - чтобы не плодить тем... Не могу найти описание хитрой конструкции:
var i=(function(){...})();

точно помню, что где-то было... Нужно именно описание, а не примеры...

Gvozd 21.09.2009 11:28

Цитата:

Сообщение от B~Vladi
Заметил, только что в call можно передавать много аргументов.

да, в общем-то и все отличия
function sum(a,b) {
    this.c = a + b
}
 
var obj = {}
 
sum.call(obj, 1,2)
// или
sum.apply(obj, [1,2])
 
alert(obj.c)   // => 3


Цитата:

Сообщение от B~Vladi
точно помню, что где-то было

наверно ты про эту тему?
http://javascript.ru/forum/misc/4071...jj-vopros.html

B~Vladi 21.09.2009 11:35

Цитата:

Сообщение от Gvozd
наверно ты про эту тему?

Да, точно! СПС:)

Цитата:

Сообщение от Gvozd
да, в общем-то и все отличия

Я подозревал, но меня сбил с толку такой текст:
Цитата:

Метод apply применяет метод одного объекта в контексте другого объекта.
и
Цитата:

Метод call вызывает метод одного объекта в контексте другого объекта.
из одного справочника...
Но теперь я спокоен:)

B~Vladi 21.09.2009 11:52

Получается, для того, чтобы выполнить JS-код не засрав при этом window можно использовать так:
(function(){...})()

Будем иметь ввиду... Углубляться, думаю, не стоит - работает и хорошо:)

Gvozd 21.09.2009 12:08

Цитата:

Сообщение от B~Vladi
не засрав при этом window

ты не засреш при этом window только именем функции
если ты будешь внутри объявлять переменные или функции без var, то все равно засрешь

B~Vladi 21.09.2009 12:45

Цитата:

Сообщение от Gvozd
если ты будешь внутри объявлять переменные или функции без var, то все равно засрешь

Естессно, я это понимаю...

У меня вот ещё какой вопрос:
Например, есть такой код:

function addClick(){
  var i='New var';
  ele.onclick=function(){
    alert(i);
  }
}


Тут обычное замыкание и при каждом вызове addClick будет создаваться функция-обработчик. Так?! А что изменит такой код:

function addClick(){
  var i='New var';
  ele.onclick=(function(){
    return function(){alert(i)}
  })();
}


Т.е. тут тоже замыкание, но я так понимаю, анонимная функция не будет клонировацо, т.к. отчищается после вызова...
Мне самое главное понять, что остаёться в памяти...

И ещё... В чём отличия записей:
var f=function(){}

и
var f=(function(){});


Сори, если пишу глупости:)

Riim 21.09.2009 12:59

Цитата:

Сообщение от B~Vladi
при каждом вызове addClick будет создаваться функция-обработчик. Так?!

Да, при каждом вызове ссылка (в onclick) на старую функцию будет затираться, и она удалится сборщиком мусора.

Цитата:

Сообщение от B~Vladi
А что изменит такой код:

Практически, вообще ничего. А вообще, первая функция ( (function(){ ) теперь тоже будет в памяти, т. к. "i" сначала в нее попадает, а потом уже во вторую функцию, она видит что ее "i" где-то используется и остается в памяти. Как только ссылка на вторую функцию будет удалена, они обе удалятся из памяти.

B~Vladi 21.09.2009 13:01

Аха, понятно...
Цитата:

Сообщение от Riim
она удалится сборщиком мусора

Это меня больше всего радует:)
Вот пытаюсь писать "грамотные" скрипты... Не нравятся замыкания... Вот разбираюсь...

B~Vladi 21.09.2009 13:18

Ещё вопрос:

такой вариант оставит жить [[scope]] внешней функции:
function(a,b){
  var f=new Function(a,b,'return a+b');
}

?! Если да, то как этого избежать?!


Часовой пояс GMT +3, время: 10:03.