21.09.2009, 11:16
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
apply и call. В чём отличия?
Читал стандарт языка, но ответа не нашел... Заметил, только что в call можно передавать много аргументов... Если есть ещё какие-нибудь отличия - напишите пжлст пример, где их можно посмотреть. Спс
|
|
21.09.2009, 11:19
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
А и ещё один вопрос - чтобы не плодить тем... Не могу найти описание хитрой конструкции:
var i=(function(){...})();
точно помню, что где-то было... Нужно именно описание, а не примеры...
|
|
21.09.2009, 11:28
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от 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
|
точно помню, что где-то было
|
наверно ты про эту тему?
Непонятная структура кода (новичковый вопрос)
|
|
21.09.2009, 11:35
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Сообщение от Gvozd
|
наверно ты про эту тему?
|
Да, точно! СПС
Сообщение от Gvozd
|
да, в общем-то и все отличия
|
Я подозревал, но меня сбил с толку такой текст:
Цитата:
|
Метод apply применяет метод одного объекта в контексте другого объекта.
|
и
Цитата:
|
Метод call вызывает метод одного объекта в контексте другого объекта.
|
из одного справочника...
Но теперь я спокоен
|
|
21.09.2009, 11:52
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Получается, для того, чтобы выполнить JS-код не засрав при этом window можно использовать так:
(function(){...})()
Будем иметь ввиду... Углубляться, думаю, не стоит - работает и хорошо
|
|
21.09.2009, 12:08
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от B~Vladi
|
не засрав при этом window
|
ты не засреш при этом window только именем функции
если ты будешь внутри объявлять переменные или функции без var, то все равно засрешь
|
|
21.09.2009, 12:45
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Сообщение от 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(){});
Сори, если пишу глупости
|
|
21.09.2009, 12:59
|
|
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
Сообщение от B~Vladi
|
при каждом вызове addClick будет создаваться функция-обработчик. Так?!
|
Да, при каждом вызове ссылка (в onclick) на старую функцию будет затираться, и она удалится сборщиком мусора.
Сообщение от B~Vladi
|
А что изменит такой код:
|
Практически, вообще ничего. А вообще, первая функция ( (function(){ ) теперь тоже будет в памяти, т. к. "i" сначала в нее попадает, а потом уже во вторую функцию, она видит что ее "i" где-то используется и остается в памяти. Как только ссылка на вторую функцию будет удалена, они обе удалятся из памяти.
|
|
21.09.2009, 13:01
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Аха, понятно...
Сообщение от Riim
|
она удалится сборщиком мусора
|
Это меня больше всего радует
Вот пытаюсь писать "грамотные" скрипты... Не нравятся замыкания... Вот разбираюсь...
Последний раз редактировалось B~Vladi, 21.09.2009 в 13:11.
|
|
21.09.2009, 13:18
|
|
Модератор Всея Форума
|
|
Регистрация: 14.05.2009
Сообщений: 4,021
|
|
Ещё вопрос:
такой вариант оставит жить [[scope]] внешней функции:
function(a,b){
var f=new Function(a,b,'return a+b');
}
?! Если да, то как этого избежать?!
|
|
|
|