Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Синтаксис. Помогите новичку (https://javascript.ru/forum/jquery/46883-sintaksis-pomogite-novichku.html)

andr2510 28.04.2014 12:06

Синтаксис. Помогите новичку
 
Друзья, помогите с синтаксисом. Я сам пересел (вчера) с c# и .net и нужно решить задачу.
1. файл начинается с кода
(function(factory) {
	if(typeof define === 'function' && define.amd) {
		define(['jquery'], factory);
	} else {
		factory(jQuery);
	}
}(function($) {...})

В документации по javascript идет классическое определение функций. А тут скобка, потом еще скобка... где копать? как называется этот синтаксис? сам прочитаю.
2. В верхнем примере в первой функции - что делает этот код? хотя когда получу ответ на первый вопрос, наверное смогу получить ответ сам. Но все равно натолкните - что читать?
3.
$.fn.fnname = function(method) {
...
var pMethods = {
			fnname1: function(){}
fnname2: function(){}}
...
		if(methods[method]) {
			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
		} else if(typeof method === 'object' || !method) {
			return methods.init.apply(this, arguments);
		}
}

я правильно понимаю, что каким то образом в method передается ссылка на метод, и кодом
if(methods[method]) {
			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
		} else if(typeof method === 'object' || !method) {
			return methods.init.apply(this, arguments);
		}
я выбираю метод из класса mthods (хотя наверно это и не класс вовсе) и передаю в него параметры arguments? Если да, то где найти доки по тому как и что идет за чем? как эти arguments появились?

Заранее спасибо. Достаточно просто названий и я докопаюсь) Хочу задачу решить быстрее а документации уж очень много. Нужно навправление.

andr2510 28.04.2014 12:30

На первый вопрос нашел ответ. Это называется Immediately-Invoked Function Expression (IIFE)

danik.js 28.04.2014 12:47

1. Это анонимная функция-выражение, которая сразу же вызывается.

// вот функция.
(function(){

})
// тут же ее вызов с аргументом blabla
(blabla)

Почему функция берется в скобки: есть два типа функций: функция-выражение, и декларация функции. Скобки просто подсказывают js-интерпретатору что это функция-выражение.

Декларация по сути как бревно, должна иметь имя и ее нельзя вызвать незамедлительно. Ее нельзя объявлять, скажем внутри блоков типа if..else и т.п. Смахивает на методы в C#.

Функция-выражение не требует имени, может передаваться аргументом. Типа лямбды в C#.

Вместо blabla у тебя передается опять же функция-выражение.

2. Результат всех этих манипуляций - переменная factory, ссылающаяся на функцию (ту, что вместо blabla). Далее, если доступна модульная система amd, то регистрируем эту функцию как модуль, иначе тут же вызываем.

3. method - это тупо строка. Допустим в качестве method нам передали строку 'fnname1'.
Тогда получаем methods['fnname1'], что тоже самое что и понятное тебе methods.fnname1. Короче чета типа Reflection из C# (слышал мельком). Только тут это называется dynamic lookup и используется повсеместно (хотя по возможности нужно избегать, ибо ломает оптимизации js-движка)

Переменная arguments доступна внутри любой функции и содержит аргументы.
Array.prototype.slice.call(arguments, 1) - тут получаем массив, содержащий второй и последующие аргументы. Если бы arguments являлся бы инстансом "класса" Array, то можно было бы писать arguments.slice(1).

fn.apply(context, [bla, bla]) - почти тоже самое что и fn(bla, bla), только устанавливает нужный контекст (ключевое слово this).
This в js - штука необычная, обязательно прочитай про него тут на сайте или где-нибудь еще. Хотя по сути все просто:
если вызываешь instance.method() - то this будет ссылаться на instance. Если вызываешь fn() - то this ссылается на глобальный объект (в браузере это window). Если при вызове используешь .call(context) или .apply(context) - то this ссылается на context.
Есть еще .bind(context) - вернет новую функцию, навсегда привязанную к контексту context.

danik.js 28.04.2014 12:53

Если у тя модульная система (например RequireJS) не используется, можешь упростить до:

(function($) {...})(jQuery)

krasovsky 28.04.2014 12:57

//это обычная функция, получает только аргументы определенные a и b
function sum(a,b){
return a+b;
}
sum(1,4);//выполняется так

А это метод
$.fn.draw = function(color){
$(this).css('background',color);//красим бэкграунд в определенный цвет
}
//Вызывается так 
$('body').draw('red');//красим тело документа в красный цвет

Так вот this - в данном случае это body, то есть тот элемент к которому применяется метод

methods в данном случае не класс а объект:
var methods = {};//создаем объект
methods['sum'] = function(){...}


call , apply служат для вызов метода с нужным контекстом

http://javascript.ru/Function/apply
http://javascript.ru/Function/call


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