Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.08.2013, 14:39
Аватар для Arramis
Кандидат Javascript-наук
Отправить личное сообщение для Arramis Посмотреть профиль Найти все сообщения от Arramis
 
Регистрация: 22.07.2013
Сообщений: 104

странный код ...
Читал одну статью на хабре - три часа потратил на то, чтобы понять самый первый пример ))
не сочтите за дибилизм, но объясните мне пожалуйста как работает вот этот пример
function f(args) 
{
     var self=this;
     var k=args.k;

     //вызываем себя же
     try
     {
         f({k:k+1});
     }
     catch(ex)
     {
          alert(k);
     }
}

var self=this;
зачем в self записываем this ?? он же не используется потом - для того чтобы иметь дело с объектом ?? если да, то зачем ?? ведь можно же обойтись обычной функцией - объектом без превращения его в чистый объект.
var k=args.k;
что здесь происходит ?? что записывается в переменную k ??
f({k:k+1});
это что за вызов функции такой ?? я так понимаю в качестве аргумента передается объект, но почему можно передавать само тело объекта в качестве параметра в функцию?
как потом вот это
var k=args.k;
обрабатывает этот вызов ?
Ответить с цитированием
  #2 (permalink)  
Старый 24.08.2013, 16:12
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Arramis
зачем в self записываем this ??
Незачем. Потому что
Сообщение от Arramis
он же не используется потом
Сообщение от Arramis
var k=args.k;
что здесь происходит ?? что записывается в переменную k ??
В переменную запишется значение свойства k объекта, переданного в качестве аргумента (имя агрумента args сбивает с толку. Замени например на blabla).
Сообщение от Arramis
я так понимаю в качестве аргумента передается объект, но почему можно передавать само тело объекта в качестве параметра в функцию?
Правильно понимаешь. Только понятия "тело объекта" нету в js. Есть понятие "литерал". Раз в функцию разрешено передать в качестве аргумента объект, то какие проблемы? Кого волнует как и где этот объект создан и имеется ли ссылка на него ввиде локальной переменной? Но если тебя это тревожит, или ты хочешь повысить читаемость кода, замени вызов на:
var object = {k: k+1};
f(object);

Последний раз редактировалось danik.js, 24.08.2013 в 16:15.
Ответить с цитированием
  #3 (permalink)  
Старый 24.08.2013, 17:21
Аватар для Arramis
Кандидат Javascript-наук
Отправить личное сообщение для Arramis Посмотреть профиль Найти все сообщения от Arramis
 
Регистрация: 22.07.2013
Сообщений: 104

danik.js,
Сообщение от danik.js Посмотреть сообщение
В переменную запишется значение свойства k объекта, переданного в качестве аргумента (имя агрумента args сбивает с толку. Замени
почему имя аргумента сбивает с толку?
меня вот больше смутил тот факт что, все что можно и не можно названо одним именем - k.

отсюда и вопросы все - например когда вызывается функция так
f({k:k+1});
значение свойства этого объекта копируется в локальную переменную k в функции (var k = ...) так ведь? тоесть получается что, в [[scope]] функции f создаются два разных свойства c одинаковым именем k ? или этот k создаётся один раз и потом при каждом новом вызове просто перезаписывается ?
Ответить с цитированием
  #4 (permalink)  
Старый 24.08.2013, 18:01
Аватар для Tim
Tim Tim вне форума
Профессор
Отправить личное сообщение для Tim Посмотреть профиль Найти все сообщения от Tim
 
Регистрация: 05.06.2009
Сообщений: 1,703

f({k:k+1});

Вызывается функция f которой передаётся объект с единственным свойством k равным k+1. Возможно более понятно будет так:
f({"k":k+1});
т.е. то, что до двоеточия - это просто имя свойства объекта.
__________________
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.
Самые главные в жизни вещи - не вещи! (было написано на одном гараже =)
Ответить с цитированием
  #5 (permalink)  
Старый 24.08.2013, 18:11
Аватар для Tim
Tim Tim вне форума
Профессор
Отправить личное сообщение для Tim Посмотреть профиль Найти все сообщения от Tim
 
Регистрация: 05.06.2009
Сообщений: 1,703

Цитата:
зачем в self записываем this ?
Дело в том this не привязан к какому либо конкретному объекты. Его значение зависит от контекста вызова.

var MyObj = new (function () {

    var self = this;

    this.myVariable = '12345';

    return {
        func1: function () {
            return self.myVariable;
        },
        func2: function () {
            return this.myVariable;
        }
    };

})();

MyObj.func1();  // "12345"
MyObj.func2();  // undefined


Т.е. var self = this; обычно используется для сохранения ссылки на контекст (объект вызова).
__________________
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.
Самые главные в жизни вещи - не вещи! (было написано на одном гараже =)
Ответить с цитированием
  #6 (permalink)  
Старый 24.08.2013, 18:51
Аватар для Arramis
Кандидат Javascript-наук
Отправить личное сообщение для Arramis Посмотреть профиль Найти все сообщения от Arramis
 
Регистрация: 22.07.2013
Сообщений: 104

Tim,
тоесть когда рекурсивно вызывается функция f({k:k+1}); каждый раз этот this ссылается на свойства и методы конкретного вызова в функции так ? но зачем это делать в примере из статьти - всё равно не понятно ...
Ответить с цитированием
  #7 (permalink)  
Старый 24.08.2013, 19:14
Аватар для Tim
Tim Tim вне форума
Профессор
Отправить личное сообщение для Tim Посмотреть профиль Найти все сообщения от Tim
 
Регистрация: 05.06.2009
Сообщений: 1,703

Сообщение от Arramis
но зачем это делать в примере из статьти - всё равно не понятно ...
Цитата:
//создаем обработчик события
self.args.indirect_call.handler_f=function(event)
В контексте этого обработчика this будет иметь другой смысл. По этому значение this сохраняется в переменную, чтобы потом, из "более глубоких участков кода" получить доступ к этому объекту. По смотри на мой пример выше внимательнее. По моему всё очевидно. this это не константа. его значение меняется. this это объект в контексте которого вызвана ф-я.
__________________
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.
Самые главные в жизни вещи - не вещи! (было написано на одном гараже =)

Последний раз редактировалось Tim, 24.08.2013 в 19:16.
Ответить с цитированием
  #8 (permalink)  
Старый 24.08.2013, 19:24
Аватар для Tim
Tim Tim вне форума
Профессор
Отправить личное сообщение для Tim Посмотреть профиль Найти все сообщения от Tim
 
Регистрация: 05.06.2009
Сообщений: 1,703

Вообще, почти любую функцию можно вызвать в контексте любого объекта с помощью методов call и apply. Ф-и определённые в глобальной области видимости вызываются в контексте глобального объекта Window. Это можно увидеть выполнив в консоли код
(function () {console.log(this)})()
__________________
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.
Самые главные в жизни вещи - не вещи! (было написано на одном гараже =)
Ответить с цитированием
  #9 (permalink)  
Старый 24.08.2013, 23:42
Аватар для Arramis
Кандидат Javascript-наук
Отправить личное сообщение для Arramis Посмотреть профиль Найти все сообщения от Arramis
 
Регистрация: 22.07.2013
Сообщений: 104

Сообщение от Tim Посмотреть сообщение
В контексте этого обработчика this будет иметь другой смысл. По этому значение this сохраняется в переменную, чтобы потом, из "более глубоких участков кода" получить доступ к этому объекту. По смотри на мой пример выше внимательнее. По моему всё очевидно. this это не константа. его значение меняется. this это объект в контексте которого вызвана ф-я.
кажется по немногу начинаю врубаться))

var obj = new (function() {
		var self = this; 						
		self.myVar = "this variable is from outer object!";
		
		return {
				f:  function() {					
						return {
							innerF: function() { 
										return {
											innerFofInnerF: function() {
																return {
																	self: self.myVar
																};	
															}
										};
							}
						};
				},
		};		
})();		
	var result_f = obj.f().innerF().innerFofInnerF().self;
	alert(result_f); // this variable is from outer object!

спасибо за помощь )
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
javascript обфускатор или как правильно скрыть код syegorius Общие вопросы Javascript 1 19.09.2012 02:58
Не работает код Kendrick Internet Explorer 5 12.09.2012 16:14
Требуется выводить код рекламного блока Adsense из файла JavaScript??? speedflow Элементы интерфейса 0 26.05.2012 15:50
Как создать bodyclick код royksopp Общие вопросы Javascript 8 14.10.2011 16:39
код странно отрабатывает комбинацию клавиш ffx Общие вопросы Javascript 4 20.01.2011 10:58