Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   странный код ... (https://javascript.ru/forum/misc/40919-strannyjj-kod.html)

Arramis 24.08.2013 14:39

странный код ...
 
Читал одну статью на хабре - три часа потратил на то, чтобы понять самый первый пример ))
не сочтите за дибилизм, но объясните мне пожалуйста как работает вот этот пример
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;
обрабатывает этот вызов ?:blink:

danik.js 24.08.2013 16:12

Цитата:

Сообщение от Arramis
зачем в self записываем this ??

Незачем. Потому что
Цитата:

Сообщение от Arramis
он же не используется потом

Цитата:

Сообщение от Arramis
var k=args.k;
что здесь происходит ?? что записывается в переменную k ??

В переменную запишется значение свойства k объекта, переданного в качестве аргумента (имя агрумента args сбивает с толку. Замени например на blabla).
Цитата:

Сообщение от Arramis
я так понимаю в качестве аргумента передается объект, но почему можно передавать само тело объекта в качестве параметра в функцию?

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

Arramis 24.08.2013 17:21

danik.js,
Цитата:

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

почему имя аргумента сбивает с толку?
меня вот больше смутил тот факт что, все что можно и не можно названо одним именем - k.

отсюда и вопросы все - например когда вызывается функция так
f({k:k+1});
значение свойства этого объекта копируется в локальную переменную k в функции (var k = ...) так ведь? тоесть получается что, в [[scope]] функции f создаются два разных свойства c одинаковым именем k ? или этот k создаётся один раз и потом при каждом новом вызове просто перезаписывается ?

Tim 24.08.2013 18:01

f({k:k+1});

Вызывается функция f которой передаётся объект с единственным свойством k равным k+1. Возможно более понятно будет так:
f({"k":k+1});
т.е. то, что до двоеточия - это просто имя свойства объекта.

Tim 24.08.2013 18:11

Цитата:

зачем в 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; обычно используется для сохранения ссылки на контекст (объект вызова).

Arramis 24.08.2013 18:51

Tim,
тоесть когда рекурсивно вызывается функция f({k:k+1}); каждый раз этот this ссылается на свойства и методы конкретного вызова в функции так ? но зачем это делать в примере из статьти - всё равно не понятно ...

Tim 24.08.2013 19:14

Цитата:

Сообщение от Arramis
но зачем это делать в примере из статьти - всё равно не понятно ...

Цитата:

//создаем обработчик события
self.args.indirect_call.handler_f=function(event)
В контексте этого обработчика this будет иметь другой смысл. По этому значение this сохраняется в переменную, чтобы потом, из "более глубоких участков кода" получить доступ к этому объекту. По смотри на мой пример выше внимательнее. По моему всё очевидно. this это не константа. его значение меняется. this это объект в контексте которого вызвана ф-я.

Tim 24.08.2013 19:24

Вообще, почти любую функцию можно вызвать в контексте любого объекта с помощью методов call и apply. Ф-и определённые в глобальной области видимости вызываются в контексте глобального объекта Window. Это можно увидеть выполнив в консоли код
(function () {console.log(this)})()

Arramis 24.08.2013 23:42

Цитата:

Сообщение от Tim (Сообщение 269133)
В контексте этого обработчика 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!

спасибо за помощь )


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