Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Анонимная функция (https://javascript.ru/forum/misc/69862-anonimnaya-funkciya.html)

Tanya51 23.07.2017 16:06

Анонимная функция
 
задача:
Создайте объект user с полем name. Создайте функцию format с параметрами start и end:
function format(start, end) {
    console.log(start + this.name + end);
}


Привяжите функцию format() к объекту user таким образом, чтобы ее вызов возвращал отформатированное имя пользователя
userFormat('<<<', '>>>'); // <<<John>>>


Реализуйте 2 версии текущего задания, используя:
1. Анонимную функцию;
2. Метод bind().


Метод bind у меня получился
function bind(func, context) {
  return function() { 
    return func.apply(context, arguments);
  };
}

var user={
  name: 'John',
};

function format(start, end) {
  console.log( start + this.name + end );
}

var userFormat = bind(format, user);

userFormat('<<<','>>>');



А вот как реализовать это же с помощью анонимной функции не понимаю. помогите пожалуйста

j0hnik 23.07.2017 17:45

var user={
	name: 'John',
	userFormat: function(start, end){
		return start + this.name + end;
	}
};
console.log(user.userFormat('<<<','>>>'));

j0hnik 23.07.2017 17:49

если методом нельзя то так
userFormat = function(start, end){
	return start + this.name + end;
};

var user={
	name: 'John',
	userFormat: userFormat
};
console.log(user.userFormat('<<<','>>>'));

Tanya51 24.07.2017 20:04

Цитата:

Сообщение от j0hnik (Сообщение 459381)
если методом нельзя то так
userFormat = function(start, end){
	return start + this.name + end;
};

var user={
	name: 'John',
	userFormat: userFormat
};
console.log(user.userFormat('<<<','>>>'));


А это анонимная функция?
userFormat = function(start, end){
    return start + this.name + end;
};


как я поняла с учебника по JS вот это анонимная функция
function(){

//какой-то код

}

j0hnik 24.07.2017 23:04

Раз имени нет, значит анонимная.

Tanya51 25.07.2017 18:49

Спасибо)

MallSerg 25.07.2017 21:46

Цитата:

Сообщение от j0hnik (Сообщение 459467)
Раз имени нет, значит анонимная.

Не верно. В данном случае функциональное выражение присваивается переменной значит это не анонимная функция.

j0hnik 25.07.2017 23:13

Цитата:

Сообщение от MallSerg (Сообщение 459604)
Не верно. В данном случае функциональное выражение присваивается переменной значит это не анонимная функция.

спорить не буду, информация почему то везде разная, даже на этом сайте статья есть https://javascript.ru/basic/functions
Как тогда привязать функцию к объекту? помогите Тане решить задачу.

MallSerg 26.07.2017 11:18

Вопрос крайне холиварный =). В основном все крутится вокруг двух тезисов:

1й тезис после ключевого слова function нет имени значит функция анонимная ( т.е. классификация по наличию признака имени ).
2й тезис функцию нельзя вызвать из других мест программы т.к. нет ссылки (имени функции) ( т.е. классификация по поведению).

Четкого определения в стандарте нет так что любые домыслы допустимы =).
Лично для меня первое определение имеет мало смысла и бесполезно а второе полезно и логично для описания поведения логики программы.
Так же стоит отменить что для меня определение анонимности может зависеть от контекста в котором исполняется код
т.е. внутри она вполне может быть доступна через ссылку или имя (именованное функциональное выражение) т.е. функция не анонимна а снаружи не доступна через ссылку или имя т.е. недоступна/анонимна.

Для меня задание не логично т.е. привязать и сохранить анонимность невозможно.

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

EugeneBash 30.07.2017 01:56

Можно так:
//oбъект c полем name
var user = {
   name: "Tom"
};

//функция format с параметрами start и end
function format(start, end) {
   console.log(start + this.name + end);
}

//привязка контекста с помощью анонимной функции
var tomFormat = function(start,end){
					format.apply(user,[start,end])
				}
tomFormat("<<<", ">>>"); // <<<Tom>>>

//привязка контекста с помощью метода bind()
var tomFormat2 = format.bind(user)
tomFormat2("<<<", ">>>");


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