Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.04.2014, 12:06
Новичок на форуме
Отправить личное сообщение для andr2510 Посмотреть профиль Найти все сообщения от andr2510
 
Регистрация: 28.04.2014
Сообщений: 2

Синтаксис. Помогите новичку
Друзья, помогите с синтаксисом. Я сам пересел (вчера) с 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 появились?

Заранее спасибо. Достаточно просто названий и я докопаюсь) Хочу задачу решить быстрее а документации уж очень много. Нужно навправление.
Ответить с цитированием
  #2 (permalink)  
Старый 28.04.2014, 12:30
Новичок на форуме
Отправить личное сообщение для andr2510 Посмотреть профиль Найти все сообщения от andr2510
 
Регистрация: 28.04.2014
Сообщений: 2

На первый вопрос нашел ответ. Это называется Immediately-Invoked Function Expression (IIFE)
Ответить с цитированием
  #3 (permalink)  
Старый 28.04.2014, 12:47
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #4 (permalink)  
Старый 28.04.2014, 12:53
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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

(function($) {...})(jQuery)
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 28.04.2014, 12:57
Профессор
Отправить личное сообщение для krasovsky Посмотреть профиль Найти все сообщения от krasovsky
 
Регистрация: 21.12.2012
Сообщений: 869

//это обычная функция, получает только аргументы определенные 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
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите плис новичку в ajax urel AJAX и COMET 6 12.01.2013 21:36
Помогите новичку! Анатолий Саратовцев Events/DOM/Window 7 04.08.2012 17:46
Выезжающая картинка. помогите плз новичку(( animus Элементы интерфейса 4 22.04.2011 14:31
Помогите пожалуйста новичку... knyazsergei Общие вопросы Javascript 2 16.06.2010 23:30
Помогите новичку с выпадающим списком interest Элементы интерфейса 5 19.05.2010 13:15