Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Какая разница между анонимной функцией и той которая имеет имя? (https://javascript.ru/forum/jquery/44988-kakaya-raznica-mezhdu-anonimnojj-funkciejj-i-tojj-kotoraya-imeet-imya.html)

koderman 10.02.2014 00:37

Несколько вопросов по JQUERY.
 
1. Какая разница между анонимной функцией и той которая имеет имя?

2. Можно в Jguery применять все методы и свойства Яваскрипта?

Vlasenko Fedor 10.02.2014 00:56

1. к именной функции ты можешь обратится в другом участке кода по имени
2. Да. Jguery - фреймворк написанный на JavaScript

koderman 10.02.2014 01:00

Анонимная функция исполняется без её вызова? То есть анонимная функция исполняется когда она была написана.
А функцию с названием нужно писать в том месте где она должна выполниться?

Вот анонимная. Написали, исполнилась

function(){
var q = 11;
}


Вот с названием. Она не выполнится пока не вызовем её kode();.

function kode(){
var q = 11;
}

Vlasenko Fedor 10.02.2014 01:47

alert(kode());
      // эта строка не выполнится myfunc - не определена
      //alert(myfunc());
      function kode() {
        return 'YES';
      }
      var myfunc = function () {
          return 'Hi';
        }
      //а здесь myfunc - уже определена
      alert(myfunc());
      var a;
      (function goodbay() {
        alert('Goodbay');
        a = 10;
      }());
      alert(a)
:haha:

koderman 10.02.2014 03:28

Это понятно. Но спасибо.
Вопрос в другом был. Отличия в выполнении анонимных функций и названных функций.

danik.js 10.02.2014 04:58

Цитата:

Сообщение от koderman
Какая разница между анонимной функцией и той которая имеет имя?

Для начала, есть два типа функций: функция-выражение, и функция-объявление.

Функция-объявление выглядит так:

function fn() {

} // точка с запятой не нужна


Она может быть вызвана до (!) ее объявления. Она не может быть анонимной.

Функция-выражение используется для callback-ов, для незамедлительного вызова и т.д. Она может быть анонимной. А может и не быть таковой.
Цитата:

Сообщение от koderman
Вот анонимная. Написали, исполнилась

Твой код неправильный, он вызовет SyntaxError.
Анонимность функции никак не влияет на ее "исполнение". Анонимность птосто означает что у функции нет имени. А следовательно, единственный вариант как-то ее использовать - это сделать что-то с ссылкой на нее.

То есть это либо сразу же вызвать функцию:
(function(){})(); // скобки подсказывают интерптератору, что наша функция является функцией-выражением


Либо присвоить ссылку в переменную:
var fn = function() {}; // Да да, это анонимная функция!


Либо передать параметром в вызов другой функции:
$.post('url', function(){});


Но все эти вещи можно делать и с не-анонимной функцией:
(function fn(){ alert(typeof fn) })();

var fn = function fn() {}; //(IE старых версий колбаснет от такого кода)

$.post('url', function fn(){});

koderman 10.02.2014 21:06

Вы решительно меня не понимаете.
$(`#object`).click(function(){ alert('Text')});

Вот написалась АНОНИМНАЯ функция и ТУТ ЖЕ она исполнилась. Кючевые слова АНОНИМНАЯ и ТУТ ЖЕ.

Вот функция с названием НАПИСАЛАСЬ
var ok = function funkciya(){
 alert('123');
}


НО ИСПОЛНИЛАСЬ только ТУТ когда эту функцию ВЫЗВАЛИ.

funkciya();

danik.js 10.02.2014 21:26

Цитата:

Сообщение от koderman
Вот написалась АНОНИМНАЯ функция и ТУТ ЖЕ она исполнилась

С чего бы вдруг? Чтобы вызвать функцию, нужно дописать скобочки:

$(`#object`).click(function(){ alert('Text')}());
Цитата:

Сообщение от koderman
Вы решительно меня не понимаете.

Похоже, потому-что ты инопланетянин, и не пониаешь нас:
Цитата:

Сообщение от koderman
Вот написалась АНОНИМНАЯ функция и ТУТ ЖЕ она исполнилась. Кючевые слова АНОНИМНАЯ и ТУТ ЖЕ.

Но выше:
Цитата:

Сообщение от danik.js
Анонимность функции никак не влияет на ее "исполнение". Анонимность птосто означает что у функции нет имени


koderman 11.02.2014 03:40

Вы проверьте код. Я проверил.
Мой вариант -правильный.

$("#object").click(function(){ alert("Text")});



Происходит событие нажатия кнопки мыши и вылазит окошко алерта.


Ну да. Тут команда .click запускает функцию, поэтому скобки не нужны?


Ага. Понял. Для моментального исполнения функции (в том месте где эта функция была написана) нужно дописывать эти скобки, а если в другом месте АНОНИМНУЮ функцию выполнить хотим, то её надо переменной присвоить.
Так бы и сказали. Столько букв написали пффф.

Это я и хотел сказать в третьем сообщении http://javascript.ru/forum/jquery/44...tml#post296821
Спасибо что про скобки сказали.

danik.js 11.02.2014 09:29

Цитата:

Сообщение от koderman
Так бы и сказали. Столько букв написали пффф.

Ну я объяснил все сразу, чтобы не было непонимания. А то ты смешал в кучу анонимность, незамедлительный вызов и разницу между выражением и объявлением.

Цитата:

Сообщение от koderman
Вот написалась АНОНИМНАЯ функция.
...
Вот функция с названием НАПИСАЛАСЬ

В обоих случаях у тебя анонимная функция!!! Если бы ты прочитал внимательней мои пояснения, то понял бы это!

Просто в первом случае ссылка на функцию передается как параметр вызываемой функции click(), а во втором случае - присваивается переменной ok. И на самом деле разницы практически никакой! Ибо параметр - это тоже переменная.

$.protototype.click = function(callback) {
    // callback ссылается на нашу анонимную функцию
    // и какая хрен разница если скажем вместо этото у нас тут будет написано
    // callback = function() {};
    this.get(0).addEventListener('click', callback);
};

$(el).click(function(){});


Цитата:

Сообщение от koderman
Вот функция с названием НАПИСАЛАСЬ
var ok = function funkciya(){
 alert('123');
}


НО ИСПОЛНИЛАСЬ только ТУТ когда эту функцию ВЫЗВАЛИ.

funkciya();

Нифига не исполнится :no:
Вот так - да: ok(). А вот имя funkciya будет видно только внутри самой функции (скажем, для рекурсивного вызова). Но об этом я не писал выше.

Короче, перечитай весь тред еще раз, походу ты не все вкурил.

koderman 11.02.2014 17:00

Ага. Лучше понял.

-----------

Цитата:

Сообщение от danik.js (Сообщение 297070)

[JS]$.protototype.click = function(callback) {
// callback ссылается на нашу анонимную функцию
// и какая хрен разница если скажем вместо этото у нас тут будет написано
// callback = function() {};

Тоесть function(callback) {} то же самое что и callback = function() {}; ??
Я думал параметр переданный в анонимную функцию возвращает события браузера. Например preventDefault
function(callback) { ("#object").callback.preventDefault;}

А где можно про $.post почитать? Трудновато почемуто находить описания комманд, методов из яваскрипта.

danik.js 11.02.2014 18:24

Цитата:

Сообщение от koderman
Тоесть function(callback) {} то же самое что и callback = function() {}; ??

Да нет же.

Я хотел сказать что вот это:
$.protototype.click = function(callback) {
    callback();
};

$().click(function() { alert('abc') });



технически мало чем отличается от:

$.protototype.click = function() {
    var callback = function() { alert('abc') };
    callback();
};

$().click();


Вся лишь разница что в первом случае мы пробрасываем функцию как параметр, а во втором не делаем этого. То есть вся разница только в использовании параметра вместо локальной переменной. А параметр - это тоже переменная. То есть это вообще не затрагивает темы анонимной функции. Вместо функции можно поставить любое значение, например объект.

Если ты посмотришь, то эти два примера идентичны твоим примерам. Но ты пыхтел что мол они пиздец как разные. А тут я показал что они (с точки зрения обсуждаемой темы) одинаковы на все 100%! То есть ты пытался найти разницу там, где ее нет :)

Цитата:

Сообщение от koderman
Я думал параметр переданный в анонимную функцию возвращает события браузера

Так и есть (ясен пень, тут ни анонимность, ни тип функции роли не играет)

Цитата:

Сообщение от koderman
А где можно про $.post почитать?

Например на api.jquery.com :)

koderman 11.02.2014 20:38

Что не правильно в коде?

Когда кликаю на картинку с идентификатором #hier , у неё должен меняться параметр src на адрес другой картинки из массива с идентификатором #eto (картинок там много.) И так при каждом клике на месте #hier должны появляться картинки из #eto.


$("#hier img").click(function() {


	$("#hier img ").attr("src" , $("#eto img").each(function(){
		$("#eto img").attr("src")})      );  
	
});


Проблема ТОЛЬКО В ЭТОЙ СТРОЧКЕ где идёт подмена методом attr
.attr("src" , $("#eto img").each


Вроде передал сюда $("#eto img") адрес текущего параметра src.

----------------------

Без функции, вот так

$("#hier img").click(function() {


	
	$("#hier img ").attr("src" , $("#eto img").attr("src")      );  
	
	
	
	
	});


Вставляется первая картинка из списка. При дальнейших кликах ничего не происходит.
Не могу цикл сделать.

danik.js 11.02.2014 20:58

koderman, ты вобще шнягу пишешь. Во-первых, задумайся: раз ты хочешь постепенно переключать картинки, то тебе нужно где-то хранить счетчик, чтобы при клике его увеличивать и менять картинку в соответствии с его значением. Счетчиком может быть к примеру глобальная переменная.

koderman 11.02.2014 21:04

Я слышал что метод each() счётчик делает.

Сейчас попробую.

Надо наверное было this применить, но в глобальную переменную засунуть.

koderman 11.02.2014 22:18

Я понял в чём проблема, но не могу её решить.
Я не могу занести в глобальную переменную параметр атрибута src.

var newi  =  $("img").each(function () {$(this).attr("src")});


Почему эта строка возвращает элемент массива

var newo = $("#eto img").attr("src");


А эта не возвращает?

var newo = $("#eto img").attr($(this).attr("src"));


Это ведь одно и тоже почти.

danik.js 11.02.2014 23:08

koderman, че ты за чепуху пишешь? Забудь про свою jquery, она тебе весь мозг отравила ))
var $images = $("#eto img");
var counter = 0;
$("#hier img").click(function() {
    if (counter == $images.length - 1)
        counter = 0;
    else
        counter += 1;
    this.src = $images[counter].src;
});

koderman 11.02.2014 23:24

Работает. Но я в jquery разобраться хочу.
И ещё разница в том что в яваскрипте возвращаются номера массива, а в Jquery возвращаются ссылки на файл.
Зачем на велосипеде ездить если можно на самолёте.


Работает. Но я в jquery разобраться хочу.
И ещё разница в том что в яваскрипте возвращаются номера массива, а в Jquery возвращаются ссылки на файл.
Зачем на велосипеде ездить если можно на самолёте.

Темболее что вот так работает

$("#eto img").click(function(){$("#hier img").attr("src" , $(this).attr("src"))});
(Когда кликаю на картинку, эта картинка появляется там где я хочу. Это легче организовать, так как можно использовать слово this которое возвращает адрес куда щёлкнула мышь).

Тоесть в обратном порядке. И это хороший код.
А как я хочу почемуто не получется.

koderman 12.02.2014 00:54

Этот код делает то что я хочу, но только один раз

$("#hier img").click(function(){$("#hier img").attr("src" , $("#eto img").attr("src"))});

Vlasenko Fedor 12.02.2014 01:09

koderman,
разделяйте логику, пишите код так, чтобы часть его можно использовать в дальнейшем
<style>
  #hier img {
    width:40px;
    height: 40px;
  }
</style>
<div id="hier">
  <img src="http://javascript.ru/forum/images/smilies/help.gif">
</div>
<div id="eto">
  <img src="http://javascript.ru/forum/images/smilies/smile.gif">
  <img src="http://javascript.ru/forum/images/smilies/haha.gif">
  <img src="http://javascript.ru/forum/images/smilies/thank_you2.gif">
  <img src="http://javascript.ru/forum/images/smilies/wink.gif">
  <img src="http://javascript.ru/forum/images/smilies/blink.gif">
</div>
<script type='text/javascript' src='http://code.jquery.com/jquery-1.9.1.js'></script>
<script>
  function next(arr) {
    var max = arr.length - 1,
      i = -1;
    return function () {
      i = i < max ? i + 1 : 0;
      return arr[i];
    };
  }

  var images = $("#eto img");
  var image =  next(images);
  $("#hier img").click(function () {
    this.src = image().src;
  });
</script>

добавил картинки, кликать по большой

koderman 12.02.2014 01:16

Я подобрался к проблеме вплотную. Теперь у меня один вопрос всего лишь.

Как передать переменной массив ?
Вот так всё работает,
$("#eto img").each(function(){
    $(this).attr('src');
	alert($(this).attr('src'));
	
});




а если передаю это всё дело переменной. Так:

var newi = $("#eto img").each(function(){
    $(this).attr('src');
	alert($(this).attr('src'));
	
});

То переменная newi не возвращает адреса которые есть в массиве.
То есть эту переменную потом нельзя использовать в качестве ссылки на этот код.


Цитата:

Сообщение от Poznakomlus (Сообщение 297192)
koderman,
разделяйте логику, пишите код так, чтобы часть его можно использовать в дальнейшем

Хмм, не понял, как разделять? Вставлять в яваскрипт теги? Иногда для читабельности удобнее без тегов просто.

Vlasenko Fedor 12.02.2014 01:27

koderman,
Цитата:

Сообщение от koderman
Хмм, не понял, как разделять? Вставлять в яваскрипт теги? Иногда для читабельности удобнее без тегов просто.

О чем пишешь?
Код который я показал смотрел?
Разобрался, понял назначение функции function next?

koderman 12.02.2014 01:32

---

koderman 12.02.2014 02:36

Функция next это счётчик и преобразователь вида ссылки.
Функции next отдали $("#eto img") в качестве параметра.
Эта функция в итоге возвращает адрес такого вида для доступа к массиву с числом в квадратных скобках.
$("#eto img")[i]
Потом плюсуется .src и получается $("#eto img")[i].src
---------------------------------
Пару вопросиков есть.

1. Что здесь делается? i = i
i приравнять к i?? зачем.

2. Что это? : 0;

3. Зачем знак доллара перед переменной? var $images (это из кода danik.js)


И в функции ещё что то было, вы исправили. log.console
Что то типа этого.
Класно придумано. Здорово. danik.js тоже почти такой же код писал. Но я буду ещё дальше с помощью чистого Jquery делать пытаться. Почти уже получилось. Только счётчик остался.

рони 12.02.2014 02:47

Цитата:

Сообщение от koderman
Класно придумано. Здорово. danik.js тоже почти такой же код писал. Но я буду ещё дальше с помощью чистого Jquery делать пытаться.

это похлеще чем кирпичём гвозди заколачивать!!!;)

Vlasenko Fedor 12.02.2014 02:53

1,2 i = i < max ? i + 1 : 0;
использование тернарного оператора http://learn.javascript.ru/ifelse
i = /* если */  i < max ? /* то равно */ i+1 : /* иначе */ 0;
// эквивалентно
if( i < max){
  i = i + 1;
} else {
  i = 0;
}

koderman, на форуме есть хороший учебник. Начните лучше с него
http://learn.javascript.ru/
console.log('Hi'); // вывод отладочных сообщений в консоль броузера. Обычно открыть консоль F12

koderman 12.02.2014 03:57

Да ладно. Знал я про тернарные операторы, подзабыл некоторые параметры. Вспомнил.))
Функцию ведь расшифровал.
Я смотрю сейчас видео уроки.
Я посмотрел несколько десятков видео часов и почти не было вопросов у меня по всему материалу.
Это как бы остатки того чего или не было в видео или ещё что то и тогда начну уже писать гумнокоды.))

Так что значит i=i (как я вижу i приравняли к i)
Зачем знак доллара перед переменной? var $images (это из кода danik.js)

koderman 12.02.2014 19:20

Господа, фиг с ним с другими вопросами. Как быть с первым?

Как на чистом jquery замутить цикл?


Вот так Только в обратном порядке.
<style>
  #hier img {
    width:40px;
    height: 40px;
  }
</style>
<div id="hier">
  <img src="http://javascript.ru/forum/images/smilies/help.gif">
</div>
<div id="eto">
  <img src="http://javascript.ru/forum/images/smilies/smile.gif">
  <img src="http://javascript.ru/forum/images/smilies/haha.gif">
  <img src="http://javascript.ru/forum/images/smilies/thank_you2.gif">
  <img src="http://javascript.ru/forum/images/smilies/wink.gif">
  <img src="http://javascript.ru/forum/images/smilies/blink.gif">
</div>
<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js'></script>
<script>
$(document ).ready(function() {
$("#eto img").click(function(){$("#hier img").attr("src" , $(this).attr("src"))}); 

}); 
</script>




Как предыдущие коды на яваскрипт работали.
Или это нерешаемая задача на Jquery ?


Только здесь надо по нижним картинкам клацать.
И заметьте насколько код меньше чем на яваскрипте.
Как в обратном порядке сделать на Jquery?

Пробовал функцию подствлять в метод attr, но этот метод видимо не принимает функции.

koderman 12.02.2014 21:44

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

Vlasenko Fedor 12.02.2014 22:46

<style>
  #hier{
    width:40px;
    height: 40px;
  }
</style>
<img id="hier" src="http://javascript.ru/forum/images/smilies/help.gif">
<div id="eto">
  <img src="http://javascript.ru/forum/images/smilies/smile.gif">
  <img src="http://javascript.ru/forum/images/smilies/haha.gif">
  <img src="http://javascript.ru/forum/images/smilies/thank_you2.gif">
  <img src="http://javascript.ru/forum/images/smilies/wink.gif">
  <img src="http://javascript.ru/forum/images/smilies/blink.gif">
</div>
<script>
  eto.onclick = function(e){
    var el = e ? e.target : window.event.srcElement;
	if (el.tagName != "IMG") return;
    hier.src = el.src;
  };
</script>

вот зачем здесь jQuery?
тебе показывают решения которые быстрее и не требуют дополнительных библиотек

danik.js 13.02.2014 08:44

Цитата:

Сообщение от koderman
И заметьте насколько код меньше чем на яваскрипте.
Как в обратном порядке сделать на Jquery?

К сожалению, констатирую jQuery головного мозга. В последнее время случаи этого заболевания участились.
В качестве лечения назначаю курс изучения JavaScript.

ruslan_mart 12.03.2014 18:52

Цитата:

Сообщение от koderman
Как на чистом jquery замутить цикл?

:lol:


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