Javascript.RU

Функции

Update: Более новый материал по этой теме находится по адресу https://learn.javascript.ru/function-basics.

В этой статье описаны функции Javascript на уровне языка: создание, параметры, приемы работы, замыкания и многое другое.

Существует 3 способа создать функцию. Основное отличие в результате их работы - в том, что именованная функция видна везде, а анонимная - только после объявления:

Именованные (FunctionDeclaration) Анонимные (FunctionExpression)
function имя(параметры) {
...
}
var имя = function(параметры) {

}
...
var имя = new Function(параметры, '...')
Именованные функции доступны везде в области видимости Анонимные - доступны только с момента объявления. Синтаксис new Function используется редко, в основном для получения функции из текста, например, динамически загруженного с сервера в процессе выполнения скриптов.
/* функция sum 
определена ниже 
*/
var a = sum(2,2)

function sum(x,y) {
	return x+y
}
/* будет ошибка, 
т.к sum еще не существует
*/
var a = sum(2,2)

var sum = function(x,y) {
	return x+y
}

В javascript функции являются полноценными объектами встроенного класса Function. Именно поэтому их можно присваивать переменным, передавать и, конечно, у них есть свойства:

function f() {
	...
}
f.test = 6
...
alert(f.test) // 6

Свойства функции доступны и внутри функции, так что их можно использовать как статические переменные.

Например,

function func() {
	var funcObj = arguments.callee

	funcObj.test++
	alert(funcObj.test)
}
func.test = 1
func()
func()

В начале работы каждая функция создает внутри себя переменную arguments и присваивает arguments.callee ссылку на себя. Так что arguments.callee.test - свойство func.test, т.е статическая переменная test.

В примере нельзя было сделать присвоение:

var test = arguments.callee.test
test++

так как при этом операция ++ сработала бы на локальной переменной test, а не на свойстве test объекта функции.

Объект arguments также содержит все аргументы и может быть преобразован в массив (хотя им не является), об этом - ниже, в разделе про параметры.

Каждая функция, точнее даже каждый запуск функции задает свою индивидуальную область видимости.

Переменные можно объявлять в любом месте. Ключевое слово var задает переменную в текущей области видимости. Если его забыть, то переменная попадет в глобальный объект window. Возможны неожиданные пересечения с другими переменными окна, конфликты и глюки.

javascript function

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

javascript function

Заданная через var переменная видна везде в области видимости, даже до оператора var. Для примера сделаем функцию, которая будет менять переменную, var для которой находится ниже.

Например:

function a() {
	z = 5 // поменяет z локально.. 

	// .. т.к z объявлена через var
	var z
}

// тест
delete z // очистим на всякий случай глобальную z
a()

alert(window.z)  // => undefined, т.к z была изменена локально

Функции можно запускать с любым числом параметров.

Если функции передано меньше параметров, чем есть в определении, то отсутствующие считаются undefined.

Следующая функция возвращает время time, необходимое на преодоление дистанции distance с равномерной скоростью speed.

mwsnap016.jpg

При первом запуске функция работает с аргументами distance=10, speed=undefined. Обычно такая ситуация, если она поддерживается функцией, предусматривает значение по умолчанию:

// если speed - ложное значение(undefined, 0, false...) - подставить 10
speed = speed || 10

Оператор || в яваскрипт возвращает не true/false, а само значение (первое, которое приводится к true).

Поэтому его используют для задания значений по умолчанию. В нашем вызове speed будет вычислено как undefined || 10 = 10.

Поэтому результат будет 10/10 = 1.

Второй запуск - стандартный.

Третий запуск задает несколько дополнительных аргументов. В функции не предусмотрена работа с дополнительными аргументами, поэтому они просто игнорируются.

Ну и в последнем случае аргументов вообще нет, поэтому distance = undefined, и имеем результат деления undefined/10 = NaN (Not-A-Number, произошла ошибка).

Непосредственно перед входом в тело функции, автоматически создается объект arguments, который содержит

  1. Аргументы вызова, начиная от нуля
  2. Длину в свойстве length
  3. Ссылку на саму функцию в свойстве callee

Например,

function func() {
    for(var i=0;i<arguments.length;i++) {
        alert("arguments["+i+"] = "+arguments[i])
    }
}
func('a','b',true)

// выведет
// arguments[0] = a
// arguments[1] = b
// arguments[2] = true

Свойство arguments похоже на массив, т.к у него есть длина и числовые индексы. На самом деле arguments не принадлежит классу Array и не содержит его методов, таких как push, pop и других.

Если все же хочется воспользоваться этими методами, например, чтобы вызвать другую функцию с теми же аргументами, но кроме первого, можно создать из arguments настоящий массив:

var args = Array.prototype.slice.call(arguments)
// .. теперь args - настоящий массив аргументов ..
args.shift()
...

Вызвать функцию для массива аргументов можно при помощи apply:

var func = function(a,b) { alert(a+b) }
var arr = [1,2]
func.apply(null, arr)  // => alert(3)

Функцию легко можно передавать в качестве аргумента другой функции.

Например, map берет функцию func, применяет ее к каждому элементу массива arr и возвращает получившийся массив:

var map = function(func, arr) {
    var result = [ ]
    for(var i=0; i<arr.length; i++) {
        result[i] = func(arr[i])
    }
    return result
}

Пример использования:

map(run, [10, 20, 30])  // = [1,2,3]

Или можно создать анонимную функцию непосредственно в вызове map:

// анонимная функция утраивает числа
map( function (a) { return a*3 } ,  [1,2,3])  // = [3,6,9]

Бывают функции, аргументы которых сильно варьируются.

Например:

// можно указать только часть аргументов
// не указанные - вычисляются или берутся по умолчанию
function resize(toWidth, toHeight,  saveProportions, animate)  {
	// значения по умолчанию
	saveProportions = saveProportions || true
	animate = animate || true
	toHeight = toHeight || ...
}

Вызов с необязательными параметрами приходится делать так:

resize(100, null, null, true)

Чтобы избежать лишних null и сделать код более понятным, используют нечто вроде "keyword arguments", существующих в Python и Ruby. Для этого много параметров пакуют в единый объект:

function resize(setup)  {
	// значения по умолчанию
	var saveProportions = setup.saveProportions || true
	var animate = setup.animate || true
	var toHeight = setup.toHeight || ...
}

Вызов теперь делается гораздо проще:

var setup = {toWidth: 100, animate: true}

resize(setup)
// или
resize({toWidth: 100, animate: true})

Так - куда понятнее. А если параметров больше 5, то вообще - единственный нормальный способ.

Кроме того, с объектом можно удобнее делать последовательности вызовов вроде:

var setup = {toWidth: 100, animate: true, saveProportions: false}

resize(setup)

setup.toWidth = 200
resize(setup)

Автор: Андрей Параничев, дата: 6 июля, 2008 - 19:05
#permalink

Конечно мне всё описанное в статье уже известно, но материал очень полезный.
Жаль, что в то время, когда я только начинал изучать программирование и JavaScript, не было таких статей...


Автор: Marantz (не зарегистрирован), дата: 20 июля, 2008 - 22:02
#permalink

Очень внятно и полезно - СПАСИБО!


Автор: Dmitry A. Soshnikov, дата: 22 июля, 2008 - 22:35
#permalink

Да, статьи у тебя, Илья, как всегда, полезны. Доходчиво написано, особенно для новичков.

Есть маленькое уточнение:

> Именованные (FunctionDeclaration)

не каждая именованная функция является declaration'ом:

function testFunctionExpression() {
  
  // функция test, хоть и имеет имя,
  // все же является FunctionExpression
  // (в скобках может быть только expression)
  (function test() {});

  // соответственно, она не попала в скоп (точнее - в variable object)
  // т.к. FunctionExpression'ы не affect'ят на него
  alert(test); // даже не undefined, а падает по ecxeption'у

}

Автор: Гость (не зарегистрирован), дата: 20 января, 2015 - 11:59
#permalink

Для новичков..?
Вот я новичок. И я ничерта не понял) После второго абзаца мозг расплавился.
Хотя я пытался выяснить простую вещь: почему в функцию передается число и не передается текст? Но этого тут я так и не нашел =\


Автор: KorniloFF-ScriptS © (не зарегистрирован), дата: 29 марта, 2015 - 10:29
#permalink

В функцию в качестве аргумента элементарно передать как числовую, так и строковую переменную.

function plus(a,b) {return a+b};
alert(plus('что ', 'не так?'));

Автор: Shock (не зарегистрирован), дата: 24 июля, 2008 - 15:42
#permalink

Спасибо огромное! Очень долго искал вот это для своей JS библиотеки:

function resize(setup)  {
    // значения по умолчанию
    var saveProportions = setup.saveProportions || true
    var animate = setup.animate || true
    var toHeight = setup.toHeight || ...
}
var setup = {toWidth: 100, animate: true}
 
resize(setup)
// или
resize({toWidth: 100, animate: true})

Автор: Репозиторий суппозиториев (не зарегистрирован), дата: 25 февраля, 2011 - 16:22
#permalink

Поддержу, отличный метод


Автор: Ляпин Дмитрий (не зарегистрирован), дата: 6 августа, 2008 - 11:52
#permalink

Отличная статья


Автор: Герман Клюшин (не зарегистрирован), дата: 21 ноября, 2008 - 11:47
#permalink

А как все таки задавать значения параметров по умолчанию?
Только уже в самом теле функции?


Автор: Илья Кантор, дата: 21 ноября, 2008 - 14:49
#permalink

Да, только в теле функции


Автор: Игорь нео (не зарегистрирован), дата: 17 декабря, 2008 - 07:12
#permalink

Блин, а я как не разбиралась в Яве, так и не разбираюсь...Надо учиться


Автор: Гость2 (не зарегистрирован), дата: 12 марта, 2009 - 14:17
#permalink

Касательно :

// если speed - ложное значение(undefined, 0, false...) - подставить 10
speed = speed || 10

Я верю,что так и будет, но не понимаю здесь преобразование типов. Я так понимаю, что В правой части speed должно преобразовываться к Boolean и если он true, то второй опреанда 10 не вычисляется, но при этом и левой части должно присвоиться значение типа Boolean, а не того типа , которое имеет speed на входе в функцию. В чем я ошибаюсь и почему ?


Автор: Илья Кантор, дата: 12 марта, 2009 - 16:59
#permalink

Оператор || в яваскрипт возвращает не true/false, а само значение (первое, которое приводится к true).


Автор: Гость (не зарегистрирован), дата: 24 ноября, 2010 - 13:56
#permalink

или последнее, которое приводится к false


Автор: kefi, дата: 13 марта, 2009 - 14:26
#permalink

Объекты , передаются в функцию по ссылке, а как передать в функцию по ссылке параметры примитивных типов (Undefined , Null, Boolean, String, Number ), чтобы можно было их изменить в функции ?


Автор: Илья Кантор, дата: 13 марта, 2009 - 23:57
#permalink

Никак. Элементарные значения не передаются по ссылке, только объекты, к которым также относятся массивы, даты и т.п.

Здесь javascript ведет себя так же, как, например, java/php5


Автор: Xnoyer (не зарегистрирован), дата: 9 июня, 2011 - 14:07
#permalink

А вот и неправда, можно привести их к object и передать в функцию, тогда они будут переданы по ссылке


Автор: B@rmaley.e><e, дата: 10 июля, 2011 - 11:49
#permalink

И тогда они не будут примитивными. Отличная логика.


Автор: nazar-pc (не зарегистрирован), дата: 10 июля, 2011 - 00:52
#permalink

PHP5 (или даже PHP4, хотя не уверен, не писал на нём чисто) прекрасно передает переменные по ссылке, но по умолчанию по ссылке передаются только объекты и ресурсы (не массивы), так что сравнение как минимум не корректное.


Автор: kefi, дата: 23 апреля, 2009 - 21:20
#permalink

Вот черт, только сейчас обнаружил, что переменные в функции могут передаваться только по значению. Хоть бы кто написал где .Все время по привычке закрывал формальные параметры локальными перменными. Sad


Автор: Леонид Евстигнеев, дата: 27 мая, 2009 - 15:31
#permalink

Насчёт заклинания:

var args = Array.prototype.slice.call(arguments)
// .. теперь args - настоящий массив аргументов ..
args.shift()
...

Хотелось бы иметь либо подробное разъяснение, либо ссылку на место где можно читать про соответствующую магию.
Я так полагаю второе предпочтительнее, т.к. это выходит за рамки статьи.


Автор: Mirash (не зарегистрирован), дата: 13 сентября, 2009 - 21:27
#permalink

Функция slice(), которая используется для преобразования возвращает новый массив со всеми значениями, переданными в функцию в качестве аргумента.


Автор: Булат (не зарегистрирован), дата: 23 августа, 2009 - 11:49
#permalink

Вопрос по поводу проставления булевых значений по умолчанию в этом куске кода:

// можно указать только часть аргументов
// не указанные - вычисляются или берутся по умолчанию
function resize(toWidth, toHeight, saveProportions, animate) {
// значения по умолчанию
saveProportions = saveProportions || true
animate = animate || true
toHeight = toHeight || ...
}

Что будет если вызвать эту функцию со следующими параметрами?

resize(100, null, false, true)

Казалось бы, если учесть следующее утверждение:

// если speed - ложное значение(undefined, 0, false...) - подставить 10
speed = speed || 10

то значение параметра saveProportions будет вычислено как false || true == true, хотя в данном случае мы хотели, чтобы saveProportions равнялось false.

Я правильно понимаю?


Автор: Гость (не зарегистрирован), дата: 15 сентября, 2009 - 08:57
#permalink

Да, Ты понимаешь правильно
пиши так:
function myFunc(s)
{
if (typeof s == "undefined") s = "default value for s";
alert(s);
};


Автор: Гость (не зарегистрирован), дата: 15 декабря, 2009 - 20:18
#permalink

Не понятно про имена функций при вызове по ссылке. Мы можем сослатся на функцию вот так:

var myFunc = function(val)
{
     alert(val);
}

myFunc('Hello'); // выдаст Hello

Тоесть мы переменную myFunc фактически приравниваем к функции.
Но мочему тогда нельзя сделать вот так?

function myFunc(val)
{
    alert(val);
}

var someVar = "myFunc";

someVar('Hello');

Вовсяком случае у меня этот код не работает.
Как быть если имя нужной функции я вычисляю и результат помещаю в строковую переменную? Тоесть строковая переменная содержит имя нужной мне функции. При попытке вызова как напрямую, так и через someVar.call() / someVar.apply() - получаю ошибку. Не ужели только через eval(someVar+"()") ?


Автор: Гость (не зарегистрирован), дата: 16 декабря, 2009 - 01:27
#permalink

Привет. Присвоение значения переменной надо делать без кавычек:
var someVar = myFunc;


Автор: Гость (не зарегистрирован), дата: 16 декабря, 2009 - 01:43
#permalink

Спасибо за ответ, но.... :-)

Суть именно в том, что в кавычках вычесляется имя функции, которую нужно запустить. Кавычки тут не зря. К примеру:

function myFunc1(val){...}

function myFunc2(val){...}

var someVar = "myFunc" + 1; 
// или 
var someVar = "myFunc" + 2

;

Это просто пример, но суть думаю понятна - имя функции вычесляется динамично.
Как в таком случае можно запустить "вычесленную" функцию? Пока я использу eval(), но есть ли более красивое решение?


Автор: Гость (не зарегистрирован), дата: 16 декабря, 2009 - 13:24
#permalink

Только если записывать ф-ию в хеш (или объявлять ее глобально, что почти тоже самое: она попадет в объект window).


Автор: Гость (не зарегистрирован), дата: 8 июня, 2010 - 22:14
#permalink

попробуй new Function для этого случая


Автор: xkav (не зарегистрирован), дата: 21 сентября, 2010 - 22:54
#permalink

Можно так сделать:

function myFunc1(){alert(1);}
function myFunc2(){alert(2);}
var someVar = window["myFunc"+1];
someVar(); // выведет 1

Автор: K313, дата: 7 марта, 2012 - 12:05
#permalink

eval('myFunc'+1+'();')


Автор: jack128 (не зарегистрирован), дата: 17 января, 2010 - 00:31
#permalink

пример к "Сворачивание параметров в объект" не очень хороший честно говоря.

вполне можно просто вызвать resize(100) и все оставшиеся аргументы возьмутся по умолчанию.
А сворачивать аргументы в объект имеет смысл если часто нуно изменять например 3 и пятый аргумент на отличные от умалчиваемых.


Автор: Гость (не зарегистрирован), дата: 28 мая, 2010 - 22:52
#permalink

Нигде не могу найти, что означает такая запись:

(function() {
  ...
})();

Автор: Гость (не зарегистрирован), дата: 1 июня, 2010 - 14:52
#permalink

Может это вызов функции, которую вернёт внутренний function?
Только зачем так...


Автор: Гость (не зарегистрирован), дата: 8 июня, 2010 - 22:17
#permalink

функция без имени создаётся и сразу вызывается.
Полезно для упрятывания от посторонних локальных переменных, и ещё из неё можно выйти через return - чего нельзя сделать, если код функции записать непосредственно.


Автор: Гость (не зарегистрирован), дата: 28 января, 2011 - 16:55
#permalink

это анониманая функция.
если сделать var f = function(){}; - это тоже создаст анонимную функцию но присврет сылку на нее локальной переменой var. () после функции - запуск ее на выполнение.
nта же констукция коорая расматриваеться создает свою область видимости (скоуп), что позволяет (как и сказал предыдущий оратор) использовать переменные не опасаясь что где-то в коде выше уже кто-то их использует перменнные с таким же именем - вообще это пример хорошего тона.


Автор: Гость (не зарегистрирован), дата: 2 августа, 2010 - 19:24
#permalink

Здравствуйте.
Скажите пожалуйста сколько значений может содержать переменная в функции в javascript?
Вот пример скрипта:
function dateString (date, string) {
var year=date.getFullYear();
var month=date.getMonth();
string = string.replace(/%Y/g, year);
string = string.replace(/%y/g, month);
return string;
}
......................

var today = new Date();
var message = dateString(today, 'Today is %Y, %y');
document.write(message);
Мне непонятно почему и как переменная string возвращает два значения (согласно условиям двух регулярных выражений). Ведь насколько мне известно с помощью return функция может возвращать лишь одно значение.
С уважением Василий.
P.S. Прошу не судить строго, возможно вопрос покажется чересчур наивным, но на JavaScript подсел не так давно и это уже начинает сильно увлекать, интересный язык.


Автор: nikvasi (не зарегистрирован), дата: 8 августа, 2010 - 23:55
#permalink

Дело в том, что функция может возвращать объекты в которых множество переменных, например a.val1=1; a.val2=1; и тд
А объект то один


Автор: MF (не зарегистрирован), дата: 18 августа, 2010 - 21:36
#permalink

Про область видимости хотелось бы узнать где она тогда начинается и заканчивается для var, какая же она локальная если до нее можно из-за пределов блока дотянуться ?


Автор: john07, дата: 24 сентября, 2010 - 22:17
#permalink

Поддерживаю вопрос. Совершенно не раскрыт.
Вот кусок кода

$(document).ready(function(){
	var $loading = $('<img src="loading.gif" alt="loading">');
	$('.dialog').each(function() {
		var $dialog = $('<div></div>').append($loading.clone());
		var $link= $(this).one('click', function() {
			$dialog.load($link.attr('href'),initForm)
				.dialog({
					title: $link.attr('title'),
					width: 788,
					height: 640,
					modal:true
				});	
			$link.click(function() {
				$dialog.dialog('open');
				return false;
			});
			return false;
		});
	});
 });

Мне непонятно, например, каким образом анонимная функция

$link.click(function() {
				$dialog.dialog('open');
				return false;
			});

получает значение $dialog при вызове по клику.


Автор: Гость (не зарегистрирован), дата: 28 июня, 2011 - 15:51
#permalink

Это обычная перемення которая выше по коду обявлена
var $dialog = $('

').append($loading.clone());


Автор: Гость (не зарегистрирован), дата: 31 августа, 2010 - 09:38
#permalink

Наишите про return. Для чего оно? Когда используется, а когда нет?


Автор: Гость (не зарегистрирован), дата: 30 сентября, 2010 - 18:01
#permalink

Не могу понять что тут происходит: Array.prototype.slice.call(arguments)
Я знаю что Array.prototype.метод(свойство) = реализация(значение) добавление метода(свойства) к статическому объекту Array. Slice() применяется к массивам для формирования выборки текущего массива. Call применяется к объекту функции для ее вызова. А вот что происходит в Array.prototype.slice.call(arguments) не могу понять???


Автор: B@rmaley.e><e, дата: 1 октября, 2010 - 21:01
#permalink

arguments конвертируется в полноценный массив.


Автор: Гость (не зарегистрирован), дата: 13 октября, 2010 - 05:28
#permalink

Здравствуйте! Хотел бы немного раскрыть тему:
""""""""""""""""""""""""""""""""""""
В примере нельзя было сделать присвоение:
var test = arguments.callee.test
test++

так как при этом операция ++ сработала бы на локальной переменной test, а не на свойстве test объекта функции
""""""""""""""""""""""""""""""""""""
Как я понял, это происходит из-за того, что даже если назначить переменной arguments.callee.test ссылку на объект, то далее при любых операциях с ним, например test++, эта переменная test превратится в значение, то есть простой number (в данном случае), а не в наследник object-а. Правьте, если не прав:)


Автор: elser (не зарегистрирован), дата: 2 сентября, 2011 - 23:11
#permalink

для простых типов справедливо следующее правило:

var v1 = "some string"; 
var v2 = v1;
var v2 = "other string" // значение v1 не изменится

но помимо простых типов есть объекты и массивы - для них правило другое:

var a1 = [1,2,3]; 
var a2 = a1;
var a2[0] = 2 // значение a1[0] тоже изменится

var o1 = {a:1, b:2, c:3}; 
var o2 = o1;
var o2.a = 2 // значение o1.a тоже изменится

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

var test = arguments.callee
test.test++

Автор: Гость (не зарегистрирован), дата: 2 апреля, 2012 - 16:59
#permalink

можно как нибудь проще?


Автор: Гость (не зарегистрирован), дата: 13 октября, 2010 - 06:36
#permalink

Прикольно так то:-D Можно сделать подобие ООП, например, вот код:
//////////////////////////////////////////////////////////
function simpleFunction() {
// Создали машинку
var car = createCar();
// Указали, что это грузовик
car.type = "грузовик";
// Поехали!
car.doRun();
}

function createCar() {
// Типа объявление переменной
var type = "";

// Типа объявление метода
var doRun = function() {
alert("Я " + car.type + " и я поехал!");
}

// Типа подобие конструктора
var car = { type: type, doRun: doRun };
return car;
}
//////////////////////////////////////////////////////////
Ну это просто так мысли вслух:)


Автор: Гость (не зарегистрирован), дата: 13 октября, 2010 - 06:39
#permalink

Замечания к своему же коду:
1. Инкапсулирование - можно через getter/setter.
2. Полиморфизм - можно сделать, тока муторно (по сравнению с чисто ООП языками).
3. Ну и там всякие области видиомости тож непонятно как.


Автор: nazar-pc (не зарегистрирован), дата: 10 июля, 2011 - 01:04
#permalink

А JavaScript не чисто ООП язык О_о?????
В нём даже функции и простые (например string) переменные - объекты, комментарий вообще мимо по-моему.
То что написано - лишь жалкое подобие класса.


Автор: B@rmaley.e><e, дата: 10 июля, 2011 - 11:41
#permalink

ООП в JS не такое, как, скажем, в Java / C++ / PHP.
В JS, например, нет классов (и, следственно, интерфейсов), специфическое наследование. Подробнее тут.


Автор: Katya (не зарегистрирован), дата: 13 ноября, 2010 - 12:12
#permalink

Подскажите, плиз, на что в данной функции будет ссылаться this? а то я только начала разбираться с JS...

function addHandler() {
for (i = 0; i < CascadingDropdowns.length; i++) {
if(CascadingDropdowns[i].parentLookup.isDropDown) {
CascadingDropdowns[i].parentLookup.Object.onchange = function() { FilterChooicesForMyChild(this); }
}
else {
CascadingDropdowns[i].parentLookup.Opthid.onpropertychange = function() { FilterChooicesForMyChild(this); }
}
alert(CascadingDropdowns[i]);
}
setupComplete = true;

}


Автор: B@rmaley.e><e, дата: 14 ноября, 2010 - 00:47
#permalink

Внутри обработчиков событий this будет ссылаться на объект, к которому эти обработчики присоединены.


Автор: Репозиторий суппозиториев (не зарегистрирован), дата: 25 февраля, 2011 - 15:54
#permalink

При добавлении через attachEvent в MSIE это не так.


Автор: Гость (не зарегистрирован), дата: 13 января, 2011 - 01:41
#permalink

-- В отличие от ряда языков, блоки не задают отдельную область видимости.

блоки это {} ? или что то другое ? а то тогда не понятно что же задает область видимости?


Автор: Leopardoff, дата: 24 мая, 2011 - 17:10
#permalink

Я так понял, что область видимости задают функции. А если просто {} - то нет.
Может я и неправильно понял...


Автор: abc_ua, дата: 16 февраля, 2011 - 01:31
#permalink

Помогите пожалуйста:

Как на событие повесить выполнение функции с передачей в нее параметров?

$("area").bind("mouseover", on (this)); ------ Не работает

function on (param) {
...
}


Автор: monolithed, дата: 17 февраля, 2011 - 17:56
#permalink
function foo(arg) {
    var result = arg*arg
    alert(result);
}

document.getElemtentById('a').onclick = function() {
    foo(2);
    return false;
};

если jQuery используется, то так:

function foo(arg) {
    var result = arg*arg
    alert(result);
}

$('#a').click(function(){
    foo(2);
    return false;
});

Автор: abc_ua, дата: 18 февраля, 2011 - 00:28
#permalink

Спасибо!


Автор: Репозиторий суппозиториев (не зарегистрирован), дата: 25 февраля, 2011 - 15:49
#permalink

"Заданная через var переменная видна везде в области видимости, даже до оператора var."
Это как так?

alert(i);
var i=10;
alert(i);

Автор: Репозиторий суппозиториев (не зарегистрирован), дата: 25 февраля, 2011 - 16:04
#permalink

То есть так: по сути фраза правильная, но требует пояснений, что undefined - это значит видна, но не имеет определенного значения.


Автор: Гость (не зарегистрирован), дата: 18 марта, 2011 - 22:44
#permalink

Здравствуйте!
Встречаю иногда вот такую конструкцию:

var somefunc=function(){
var id = 'tt';
...
return{
show:function(){
...
},
hide:function(){
...
}
};
}();

Используется она вот так:

somefunc.show();

Что это, зачем ? Почему просто не использовать объект ?
Почему после завершающей фигурной скобки стоит () ?
Где про это можно почитать ?


Автор: Leopardoff, дата: 24 мая, 2011 - 16:58
#permalink

Почему не используется объект - это вопрос тем, кто писал код. Скорее всего здесь функция, чтобы передать доп. параметры.
А () - это оператор вызова функции. Соответственно, всё это выражение возвращает объект, который присваивается переменной somefunc, а потом происходит обращение к его свойству.


Автор: Гость (не зарегистрирован), дата: 30 августа, 2011 - 14:32
#permalink

Это же замыкания - для того чтобы в функциях somefunc.show() и somefunc.hide() была определена переменная id не глобальная


Автор: lapshukov (не зарегистрирован), дата: 4 апреля, 2011 - 13:36
#permalink

недавно чисто интуитивно для статик переменной использовал this, почитал статью дошел до места http://javascript.ru/basic/functions#funkcii---obekty, и понял - что что то я не то сделал... чем грозит использование this в подобных целях?


Автор: lapshukov (не зарегистрирован), дата: 4 апреля, 2011 - 13:43
#permalink

екзампл к предыдущему комменту

function my() {
    if(this.count)this.count++;
    else this.count = 1;
}
my();
my();
my();

Автор: lapshukov (не зарегистрирован), дата: 4 апреля, 2011 - 13:47
#permalink

дошел в чем проблема, глобальная видимость этой переменной, извините за спам


Автор: Marwell, дата: 10 мая, 2011 - 07:14
#permalink

Подскажите, после отработки функции она находится в памяти и может мешать другим функциям? И как можно принудительно выгрузить из памяти функцию?


Автор: Leopardoff, дата: 24 мая, 2011 - 17:06
#permalink

Вообще, я знаю, что в js нет управления памятью (слишком жирно было бы), но сборка мусора есть. Поэтому функция может быть выгружена из памяти, если на нее будут удалены все ссылки. Пример:

function r(){}
alert(r);
window.r = null;
alert(r);

Автор: raymank26 (не зарегистрирован), дата: 29 июня, 2011 - 21:14
#permalink

Так.. объекты и примитивные типы передаются в функцию только по значению. Никакой передачи по ссылке объектов не существует.Автор, поправь статью. Эта проблема затронута в книге Professional JavaScript for Web Developers.


Автор: Гость (не зарегистрирован), дата: 31 августа, 2011 - 15:06
#permalink

Насчет Вызывание функцию для массива аргументов можно при помощи apply:

var func = function(a,b) { alert(a+b) }
var arr = [1,2]
func.apply(null, arr) // => alert(3)

Почему в примере аргумент функции null? и как этот пример выводит 3? Можете разъяснит?

Спасибо.


Автор: Гость (не зарегистрирован), дата: 4 ноября, 2011 - 16:36
#permalink

На сколько я знаю, дело в функции apply. Первым параметром для нее является контекст обьекта, который в данном случае может быть null ( будем использован глобальный контекст ). А вторым аргументом идет массив параметров для той же функции func. В результате этот массив и интерпретируется как а и b.


Автор: Гость (не зарегистрирован), дата: 21 ноября, 2011 - 10:45
#permalink

А как в качестве аргумента функции JS передать массив сформированный в php скрипте.
Если в теле функции писать просто arrayArg[0] и т.д. то это не работает


Автор: Бездомный (не зарегистрирован), дата: 22 января, 2012 - 22:28
#permalink

Народ подскажите плиз, как подключить ява-скрипт на странице, путем нажатия кнопки юзером на сайте?


Автор: K313, дата: 7 марта, 2012 - 12:19
#permalink
onclick=function(){
var scrs=document.getElementsByTagName('SCRIPT'); 
for(var i=0;i<scrs.length;i++){if(scrs[i].src=='my_script.js')return false;} 
var sc=document.createElement('SCRIPT'); 
document.getElementsByTagName('HEAD')[0].appandChild(sc); 
sc.src='my_script.js';
}

Автор: Гость (не зарегистрирован), дата: 19 апреля, 2012 - 22:53
#permalink

В статье ошибка:
{
var i=0;
}

эквивалентно !!! ошибка

var i=0;
{

}

надо

var i;
{
i=0;
}


Автор: patya (не зарегистрирован), дата: 20 августа, 2012 - 18:22
#permalink

Я бы не назвал это так громко - ошибкой . Это вообще не ошибка - показано, что переменная видна как в скобках, так и за в обоих случаях, независимо в каком месте она объявлена, что и требовалось.


Автор: Гость (не зарегистрирован), дата: 5 марта, 2013 - 20:20
#permalink

чем отличаются
( function(){ } )() - круглые скобки снаружи
от
( function(){ }() ) - внутри


Автор: Гость (не зарегистрирован), дата: 14 июня, 2013 - 03:27
#permalink

ничем


Автор: Max_Cohen (не зарегистрирован), дата: 4 мая, 2013 - 12:21
#permalink

Привет!
Почему Я не могу получить значение return в переменную aname?
Выводит undefined.

function at1cx(id){
	var aname=aajax(id);
}
function aajax(id){
	var a=new XMLHttpRequest();
	var b=false;
	a.open("GET","a.php?a="+id.value,true);
	a.onreadystatechange=function(){
		if(a.readyState==4)
			if(a.status==200){
				aspan.innerHTML=a.responseText;
				if(a.responseText>0)
					return 'F';
				else
					return 'T';
			}
	}
	a.send(null);
}

А как получить значение return?


Автор: Гость (не зарегистрирован), дата: 4 мая, 2013 - 19:29
#permalink

a.status не 200


Автор: classic-elite (не зарегистрирован), дата: 23 января, 2015 - 19:13
#permalink

Ваш return возвращает значение НЕ из функции aajax() (как Вы, должно быть, предполагали), а из анонимной функции, присвоенной методу onreadystatechange.
а функция aajax() вообще не возвращает значения.


Автор: quint (не зарегистрирован), дата: 14 мая, 2013 - 10:35
#permalink

Подскажите а можно ли переменной присвоить картинку а потом вызывать эту картинку через переменную, если можно то как.


Автор: im2002, дата: 27 мая, 2013 - 14:21
#permalink

люди подскажите практический пример использования callee, если можно не применительно к web. я "написал"
function test()
{
var funcObj = arguments.callee;
funcObj.t = arguments.length; // определяем свойство t
return funcObj.t;
}
v = test("xcd", 34, false);
WScript.Echo("Функция была вызвана с " + v + " аргументами");

только непонятно как/в каком случае полезно использовать callee???


Автор: Гость (не зарегистрирован), дата: 27 мая, 2013 - 14:29
#permalink

Очень подробное описание с примерами

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_...


Автор: Гость (не зарегистрирован), дата: 17 июня, 2013 - 09:20
#permalink

Доброго дня! Допоможіть будь ласка. Є два діва з текстом, колір тексту ми не знаємо. при кожному натисканні на кнопку кольри текстів міняються між собою. Потрібно описати JS.


Автор: lancer, дата: 21 июля, 2013 - 13:09
#permalink

Переведите на русский.


Автор: Гость (не зарегистрирован), дата: 2 сентября, 2013 - 07:06
#permalink

var имя = function(параметры) {

}
это не анонимные функции, анонимные это function(параметры) {…}


Автор: sergej_savelev, дата: 20 сентября, 2013 - 17:01
#permalink

Почему отображает undefined?:

function sc(abs){
        abs = abs || 'z-index';
        $('.menu>li>div:first').css(abs)
    }
    
    alert( sc() )

Было бы удобно далее делать так:

$('<div class="menupanel"><div class="left"></div><div class="right"></div></div>').appendTo('body').css({
        position:'absolute',
        zIndex: sc('z-index'),
        left: sc('left'),
        top: sc('top'),
        width: sc('width'),
        height: sc('height'),
        background: 'white'
    });

Автор: Гость (не зарегистрирован), дата: 18 февраля, 2014 - 13:42
#permalink
speed = speed || 10

Не будет работать с undefined.


Автор: Владислав Антонович (не зарегистрирован), дата: 10 марта, 2014 - 20:49
#permalink

Есть функция, которая находит html элементы, берет их значение, меняет, заменяет значение. Когда происходит обновление странички ajax'ом, функция видит только старые элементы - новых просто нет. Как сделать так, чтобы функция корректо работала с новыми элементами?

Предполагаю что дело в том, что html элементы находятся функцией единожды - при ее создании. Значит мне нужно переобъявлять функцию?

Прошу js-гуру помочь!


Автор: котофей (не зарегистрирован), дата: 27 марта, 2014 - 15:06
#permalink

В firefox, из HTML-странички, вызвал testSum из кода:

var sum = function(a,b) {
alert(a+b)
}

var testSum = function() {
var arr1 = [1,2,3]
var arr2 = [4,5,6]
var arr3 = [7,8,9]
sum.apply(arr1,arr2,arr3)

Получил результат 7, т.е. функция sum получила два первых параметра из второго массива. Пробовал с другими количествами массивов и параметров, с разными длинами массивов. Понимания как работает apply это не прибавило. Не могли бы Вы прояснить как работает apply, если не трудно?
Заранее благодарен.


Автор: Гость с юга (не зарегистрирован), дата: 27 июня, 2014 - 10:32
#permalink

котофей,
"метод" apply обрабатывает два параметра
- контекст выполнения (англ. scope);
- аргументы (параметр должен быть массивом);
Остальные параметры игнорируются. Для иллюстрации изменим Ваш пример.

(function(a,b){
  console.log(this);      // первый параметр в вызове apply
  console.log(arguments); // второй параметр в вызове apply
  
  return a+b
}).apply(
  [1,2,3], // контекст, в вызывемой функции - this 
  [4,5,6], // массив параметров, в вызываемой функции - arguments
  [7,8,9]  // не обрабатывается, как и все последующие параметры
);

Автор: котофей (не зарегистрирован), дата: 27 марта, 2014 - 15:08
#permalink

извините, не 7, а 9, конечно. 4+5 = 9.


Автор: Гость (не зарегистрирован), дата: 18 мая, 2014 - 13:37
#permalink

Что эффективнее (быстрее): использовать в теле функции глобальную переменную (как неизменяемую величину) или эту глобальную передать функции как параметр?


Автор: РусланИКС (не зарегистрирован), дата: 20 ноября, 2014 - 10:34
#permalink

Помогите понять как расшифровать такую запись

function myhash(b,e,f){(f='')||(e=window)&&(b||(b=e[18])));
f+=b;return f}

Интересует вот это - (f='')||(e=window)&&(b||(b=e[18])));
Что здесь объявляется или какие условия что выполняют?


Автор: Bokal (не зарегистрирован), дата: 20 декабря, 2014 - 09:23
#permalink

>встроенного класса Function
- в JavaScript нет классов - это язык прототипный)


Автор: Гость (не зарегистрирован), дата: 6 апреля, 2016 - 13:58
#permalink

Подскажите как сделать чтоб звук воспроизводился сразу при попытке закрытия окна?

window.onbeforeunload = function() {
  var audio = new Audio(); // Создаём новый элемент Audio
  audio.src = '1.mp3'; // Указываем путь к звуку "клика"
  audio.autoplay = true; // Автоматически запускаем
    
return "подождите";

  }

ЗВук воспроизводиться только после закрытия этого окна(


Автор: Imran (не зарегистрирован), дата: 22 октября, 2017 - 18:02
#permalink

В объявлении function f_8(gold,silver,cash,stock,commercial,future_income,debts) много переменных.
Когда переменных больше двух, то нужно писать вот так
- объвляем function f_8(props)
- вызываем так:
f_8 ({
gold: 1,
silver: 1,
cash: 1,
stock: 1,
commercial: 1,
future_income: 1,
debts: 1,
})

- внутри используем их так:
props.gold, props.siler и так далее.
Пожалуйста можете это мне на примере показать, я вообще не врубаюсь, что мне говорит этот человек


Автор: Гость (не зарегистрирован), дата: 4 ноября, 2017 - 12:43
#permalink

Очень подробно четко красиво очень рад то что я нашел этот сайт спасибо Админам!


Автор: Гость (не зарегистрирован), дата: 9 августа, 2018 - 18:31
#permalink

В статье "В javascript функции являются полноценными объектами" - не корректно. Объект не копируется при присваивании переменной.


Автор: Гость (не зарегистрирован), дата: 4 октября, 2018 - 12:58
#permalink

Функции полезные, но разрабатывать на Javascript можно еще быстрее и эффективнее.


Автор: Ryui (не зарегистрирован), дата: 23 декабря, 2019 - 07:16
#permalink

Если функции передано меньше параметров, чем есть в определении, то отсутствующие считаются undefined. moto x3m free


Автор: nhatvuong (не зарегистрирован), дата: 3 января, 2020 - 10:12
#permalink

Your feedback helps me a lot, A very meaningful event, I hope everything will go well candy crush soda


Автор: nojesip (не зарегистрирован), дата: 28 января, 2020 - 18:46
#permalink

I am happy to find your distinguished way of writing the post. Now you make it easy for me to understand and implement the concept. Thank you for the post.
causas de los ataques de ansiedad


Автор: jams (не зарегистрирован), дата: 16 февраля, 2020 - 11:10
#permalink

Thank you for taking the time to publish this information very useful!
Digital Marketing Adelaide


Автор: farhan (не зарегистрирован), дата: 23 марта, 2020 - 11:10
#permalink

Nice post! This is a very nice blog that I will definitively come back to more times this year! Thanks for informative post.
hire indonesian maid


Автор: farhan (не зарегистрирован), дата: 23 марта, 2020 - 11:10
#permalink

Nice post! This is a very nice blog that I will definitively come back to more times this year! Thanks for informative post.
hire indonesian maid


Автор: ГостьD365 Finance and Operations Credit Card Processing (не зарегистрирован), дата: 26 апреля, 2020 - 22:46
#permalink

Thanks for posting this info. I just want to let you know that I just check out your site and I find it very interesting and informative. I can't wait to read lots of your posts.


Автор: Гость (не зарегистрирован), дата: 15 июля, 2020 - 17:49
#permalink

I just want to let you know that I just check out your site and I find it very interesting and informative..
gel antibacterial hand sanitizer Wholesale


Автор: john bond (не зарегистрирован), дата: 24 июля, 2020 - 09:41
#permalink

Thanks a lot for sharing us about this update. Hope you will not get tired on making posts as informative as this.


Автор: john bond (не зарегистрирован), дата: 24 июля, 2020 - 09:42
#permalink

I admire what you have done here. I like the part where you say you are doing this to give back but I would assume by all the comments that this is working for you as well.
best natural products websites


Автор: john bond (не зарегистрирован), дата: 24 июля, 2020 - 13:03
#permalink

Thanks so much for this information. I have to let you know I concur on several of the points you make here and others may require some further review, but I can see your viewpoint.
The Auto Negotiator


Автор: john bond (не зарегистрирован), дата: 24 июля, 2020 - 21:33
#permalink

An fascinating discussion is value comment. I think that it is best to write extra on this matter, it won’t be a taboo topic however generally people are not enough to talk on such topics. To the next. Cheers
cuentos infantiles cortos


Автор: john bond (не зарегистрирован), дата: 30 июля, 2020 - 00:55
#permalink

Great knowledge, do anyone mind merely reference back to it
MDMA WITHOUT RX


Автор: johnb6 (не зарегистрирован), дата: 18 августа, 2020 - 17:56
#permalink

Awesome and interesting article. Great things you've always shared with us. Thanks. Just continue composing this kind of post.
concept map maker


Автор: john bond (не зарегистрирован), дата: 31 августа, 2020 - 17:17
#permalink

This type of message always inspiring and I prefer to read quality content, so happy to find good place to many here in the post, the writing is just great, thanks for the post.
Guia de empresas


Автор: Гость (не зарегистрирован), дата: 9 сентября, 2020 - 18:46
#permalink

Wow the blog you give us is amazing, no wonder many people want to read this. https://celebrityinsider.org/


Автор: Гость (не зарегистрирован), дата: 9 сентября, 2020 - 18:48
#permalink

I will recomend this blog to all of my friends. Great article.
https://happygamer.com/


Автор: Гость (не зарегистрирован), дата: 9 сентября, 2020 - 18:50
#permalink

Thank you for this inspiring blog. I wait for more
https://ballstepded.com/


Автор: Гость (не зарегистрирован), дата: 9 сентября, 2020 - 18:50
#permalink

I learned so much from this blog. Good inforamtion. https://fixoserror.com/


Автор: Гость (не зарегистрирован), дата: 9 сентября, 2020 - 18:50
#permalink

I wait for more.Great article.
https://premiereretail.com


Автор: Гость (не зарегистрирован), дата: 9 сентября, 2020 - 18:51
#permalink

I stumbled across this blog.Great article. https://tecsprint.com


Автор: Гость (не зарегистрирован), дата: 9 сентября, 2020 - 18:52
#permalink

Thank you for this amazing blog. Congratulations.
https://howtolose10poundsinaweek.com


Автор: Гость (не зарегистрирован), дата: 9 сентября, 2020 - 18:52
#permalink

The things i see here are very informative. Keep going. https://bargainistafashionista.com


Автор: Гость (не зарегистрирован), дата: 9 сентября, 2020 - 18:53
#permalink

I can say that is one of the best articles out on the internet. https://bankncard.com


Автор: Гость (не зарегистрирован), дата: 9 сентября, 2020 - 18:53
#permalink

I readed all the article. So informative https://vhan.net


Автор: Гость (не зарегистрирован), дата: 10 сентября, 2020 - 16:21
#permalink

This is one of the best sites i have found on the internet until now. Nice article keep going.
https://millikenconstructioninc.com/


Автор: Гость (не зарегистрирован), дата: 11 сентября, 2020 - 16:15
#permalink

Thanks for the information, very clear and simple. I will try to use it.Love the way you write. Working my way through your article links
https://vvhen.to/


Автор: Гость (не зарегистрирован), дата: 15 сентября, 2020 - 12:09
#permalink

This is one of the best articles i found on the blogs around the internet. I am really interested in seeing more of this. Keep going with the great work!
https://gzgjskpzz1m.ga


Автор: Гость (не зарегистрирован), дата: 19 сентября, 2020 - 10:56
#permalink

First of all ,you have picked a very unique theme . I think i might design something similar for a future project that i want to build .
On top of that ,i in truth enjoy most of your content pieces and your different point of view.
Thank you https://seoconsultants24.blogspot.com/


Автор: Гость (не зарегистрирован), дата: 19 сентября, 2020 - 10:56
#permalink

First of all ,you have picked a very unique theme . I think i might design something similar for a future project that i want to build .
On top of that ,i in truth enjoy most of your content pieces and your different point of view.
Thank you https://seoconsultants24.blogspot.com/


Автор: Гость (не зарегистрирован), дата: 19 сентября, 2020 - 11:34
#permalink

Nice information, many thanks to the author. It is incomprehensible to me now, but in general, the usefulness and significance is overwhelming.https://seokarma24.blogspot.com/


Автор: Гость (не зарегистрирован), дата: 19 сентября, 2020 - 15:20
#permalink

I have reviewed the article many times and I find it very impressive. The information is extremely useful especially the last part I care about that information very much. I have been looking for this certain information for a long time.
https://packseo.blogspot.com/


Автор: Гость (не зарегистрирован), дата: 23 сентября, 2020 - 16:58
#permalink

I’m gone to tell my little brother, that he should
also pay a quick visit this blog on regular basis to take updated from hottest information.
https://connectorseo.blogspot.com/


Автор: Гость (не зарегистрирован), дата: 23 сентября, 2020 - 17:06
#permalink

You have made some really good points there. I looked on the web to find out
more about the issue and found most individuals will go along with your views on this website
https://digitalseo24h.blogspot.com/


Автор: Гость (не зарегистрирован), дата: 23 сентября, 2020 - 17:13
#permalink

Fantastic blog! Do you have any helpful hints for aspiring writers?
I’m hoping to start my own site soon but I’m a little lost on everything.
https://sweetseo24h.blogspot.com/


Автор: Гость (не зарегистрирован), дата: 23 сентября, 2020 - 18:16
#permalink

I am hoping the same best effort from you in the future as well. In fact your creative writing skills has inspired me.
https://fancyseo24h.blogspot.com/


Автор: john bond (не зарегистрирован), дата: 25 сентября, 2020 - 19:14
#permalink

Thank you for such a well written article. It’s full of insightful information and entertaining descriptions. Your point of view is the best among many.
frete mudança águas claras


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
4 + 0 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum