Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.09.2009, 10:16
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,022

apply и call. В чём отличия?
Читал стандарт языка, но ответа не нашел... Заметил, только что в call можно передавать много аргументов... Если есть ещё какие-нибудь отличия - напишите пжлст пример, где их можно посмотреть. Спс
Ответить с цитированием
  #2 (permalink)  
Старый 21.09.2009, 10:19
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,022

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

точно помню, что где-то было... Нужно именно описание, а не примеры...
Ответить с цитированием
  #3 (permalink)  
Старый 21.09.2009, 10:28
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 03.04.2008
Сообщений: 6,233

Сообщение от 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
точно помню, что где-то было
наверно ты про эту тему?
Непонятная структура кода (новичковый вопрос)
Ответить с цитированием
  #4 (permalink)  
Старый 21.09.2009, 10:35
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,022

Сообщение от Gvozd
наверно ты про эту тему?
Да, точно! СПС

Сообщение от Gvozd
да, в общем-то и все отличия
Я подозревал, но меня сбил с толку такой текст:
Цитата:
Метод apply применяет метод одного объекта в контексте другого объекта.
и
Цитата:
Метод call вызывает метод одного объекта в контексте другого объекта.
из одного справочника...
Но теперь я спокоен
Ответить с цитированием
  #5 (permalink)  
Старый 21.09.2009, 10:52
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,022

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

Будем иметь ввиду... Углубляться, думаю, не стоит - работает и хорошо
Ответить с цитированием
  #6 (permalink)  
Старый 21.09.2009, 11:08
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 03.04.2008
Сообщений: 6,233

Сообщение от B~Vladi
не засрав при этом window
ты не засреш при этом window только именем функции
если ты будешь внутри объявлять переменные или функции без var, то все равно засрешь
Ответить с цитированием
  #7 (permalink)  
Старый 21.09.2009, 11:45
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,022

Сообщение от 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(){});


Сори, если пишу глупости
Ответить с цитированием
  #8 (permalink)  
Старый 21.09.2009, 11:59
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

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

Сообщение от B~Vladi
А что изменит такой код:
Практически, вообще ничего. А вообще, первая функция ( (function(){ ) теперь тоже будет в памяти, т. к. "i" сначала в нее попадает, а потом уже во вторую функцию, она видит что ее "i" где-то используется и остается в памяти. Как только ссылка на вторую функцию будет удалена, они обе удалятся из памяти.
Ответить с цитированием
  #9 (permalink)  
Старый 21.09.2009, 12:01
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,022

Аха, понятно...
Сообщение от Riim
она удалится сборщиком мусора
Это меня больше всего радует
Вот пытаюсь писать "грамотные" скрипты... Не нравятся замыкания... Вот разбираюсь...

Последний раз редактировалось B~Vladi, 21.09.2009 в 12:11.
Ответить с цитированием
  #10 (permalink)  
Старый 21.09.2009, 12:18
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,022

Ещё вопрос:

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

?! Если да, то как этого избежать?!
Ответить с цитированием
Ответ



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

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