Kozack
@Kozack
Thinking about a11y

Как использовать контекст в JavaScript?

Три простых примера кода:
1. Создаем указатель на объект
var App = {
	// Свойство
	name: 'Alex',
	// Асинхронный метод
	asuncFunc: function () {
		var deferred = $.Deferred();

		setTimeout(function () {
			deferred.resolve();
		}, 5000);

		return deferred.promise();
	},
	// Обработчик (тут нужно обратится к свойству)
	say: function () {
		var app = this;
		app.asuncFunc().done(function () {
			console.log(this); // Deferred
			console.log(app.name);
		});
	}
}


2. Во втором варианте мы сохраняем контекст в обработчике
var App = {
	// Свойство
	name: 'Alex',
	// Асинхронный метод
	asuncFunc: function () {
		var deferred = $.Deferred();

		setTimeout($.proxy(deferred, 'resolveWith', this), 5000);

		return deferred.promise();
	},
	// Обработчик (тут нужно обратится к свойству)
	say: function () {
		this.asuncFunc().done(function () {
			console.log(this); // App
			console.log(this.name);
		});
	}
}


3. Используем глобальный объект (при условии что он один и не дублируется)
var App = {
	// Свойство
	name: 'Alex',
	// Асинхронный метод
	asuncFunc: function () {
		var deferred = $.Deferred();

		setTimeout(function () {
			deferred.resolve();
		}, 5000);

		return deferred.promise();
	},
	// Обработчик (тут нужно обратится к свойству)
	say: function () {
		App.asuncFunc().done(function () {
			console.log(this); // Deferred
			console.log(App.name);
		});
	}
}


Какой из трех вариантов работы с контекстом наиболее правильный? Какие особенности в плане производительности и т.д.?
  • Вопрос задан
  • 419 просмотров
Решения вопроса 1
In4in
@In4in
°•× JavaScript Developer ^_^ ו°
Никаких различий в плане производительности нет. Использовать или не использовать this - дело ваше. Если планируете делать так:

var FuncObj = {
  f1 : function(){
      console.log(this);
  }
}

FuncObj.f1(); //FuncObj

var copyF1 = FuncObj.f1;
copyF1(); //window


То, само собой, нужно использовать не контекст, а неизменную ссылку на объект. И лучше так:

var FuncObj = (function(FO){

 return FO = {
    f1 : function(){
       console.log(FO.data);
    },
    data : "8 800 555 3535"
 }

})();

var copyF1 = FuncObj.f1;
copyF1(); //FuncObj.data


Как правило, this полезен только при конструировании объектов, а у вас будет просто небольшая кучка, независимых от вне, статических методов...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
С точки зрения производительности все 3 примера одинаковы.
А вот данные в глобале это очень плохо для отладки и поддержки кода. по крайней мере, когда они уж так необходимы, нужно везде в коде указывать их через глобальный объект (в браузере это windows), т.е. window.App js то оно пофигу, хотя и тут есть исключение, а вот программистам нет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 08:04
1 руб./за проект
22 нояб. 2024, в 06:06
1500 руб./в час
22 нояб. 2024, в 06:04
1 руб./за проект