Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как обратиться к переменной внутри объекта, в произвольной функцию через его метод (https://javascript.ru/forum/dom-window/30997-kak-obratitsya-k-peremennojj-vnutri-obekta-v-proizvolnojj-funkciyu-cherez-ego-metod.html)

platedz 23.08.2012 01:26

Как обратиться к переменной внутри объекта, в произвольной функцию через его метод
 
Даже не знаю как спросить.
obj = function()
	{
		var elem = "Элемент";
		
		return {
		
				functio: function(f)
					{
					
						f();
				
						return this;
				
					}
				}
		}();
 
obj.functio(function(){alert(elem);});


Нужно чтобы alert вывел elem который находится внутри объекта. Можно ли как - то так сделать?

oneguy 23.08.2012 01:34

Возможно, вам нужен метод Function.prototype.bind? Он позволяет привязать аргумент this и обычные аргументы к функции динамически.

platedz 23.08.2012 02:09

Возможно, но я честно говоря не нашел никакой полезной информации в яндексе по запросу prototype.bind и Function.prototype.bind. Подскажите, пожалуйста, как этот метод работает.

oneguy 23.08.2012 02:36

Цитата:

Сообщение от platedz
Возможно, но я честно говоря не нашел никакой полезной информации в яндексе по запросу prototype.bind и Function.prototype.bind. Подскажите, пожалуйста, как этот метод работает.

Здесь можно прочитать: https://developer.mozilla.org/en-US/.../Function/bind, если владеете английским. В учебнике тоже есть статья: http://learn.javascript.ru/bind#%D1%...%BE%D0%B4-bind. Метод bind, однако, не работает в IE<9.

platedz 23.08.2012 02:51

Спасибо. Попробую с помощью переводчика разобраться. Может где-то есть русскоязычная информация и в более доступной форме. Или кто-то объяснит на простом примере. Да и с прототипами у меня пока еще крайне туго.

oneguy 23.08.2012 02:55

Я потом нашёл это в нашем учебнике - вторая ссылка в моём предыдущем сообщении.

oneguy 23.08.2012 03:03

Короче, попробую объяснить своими словами.
Функция Function.prototype.bind имеет синтаксис
function (thisArg [, arg1, arg2, ... ])
где thisArg - привязанный аргумент this; arg1, arg2, ... (если есть) - привязанные обычные аргументы. При этом исходная функция передаётся в качестве аргумента this.
Данная функция возвращает новую функцию особого типа - не имеющюю своего кода, а имеющую внутренний указатель на исходную функцию, привязанный аргумент this и обычные аргументы (если есть) в качестве своих внутренних свойств.
При вызове этой новой функции вызывается привязанная исходная функция, передаётся привязанный аргумент this в качестве аргумента this (раннее переданного как thisArg) вместо стандартной процедуры определения this, передаётся список аргументов состоящий из привязанных агрументов (раннее переданных как arg1, arg2, ...) и аргументов (новых аргументов), переданных в новую функцию. Новые аргументы идут в списке после привязанных аргументов.

Простой пример:
function f (a, b, c) {
  alert(this+" "+a+" "+b+" "+c);
}
var g=f.bind(42, 1, 2); // привязываем 42 в качестве this; 1, 2 в качестве обычных аргументов
g(3); // 3 - новый аргумент в функцию f
g.call(43, 3); //переданный явно аргумент this игнорируется

tadjik1 23.08.2012 12:35

platedz,
никак вы не получите доступ — elem приватное свойство.

platedz 23.08.2012 23:41

tadjik1,
Сам по себе elem равен пустоте

obj = function()
	{
		var elem = [];
		
	return {
                teg: function(name)

                  {

                 elem = document.querySelectorAll(name);

                    return this;

                },

				functio: function(f)
					{
					
						f();
				
						return this;
				
					}
				}
		}();
 
obj.teg("div").functio(function(){alert(elem);});

В принципе тут и надо к нему как то обратиться.

platedz 23.08.2012 23:44

Почитал про bind. В примере с функцией вроде понятно, а вот на примере метода до меня никак не доходит. Может кто-нибудь даст пару простых примеров с объяснениями. Буду крайне признателен.

oneguy 23.08.2012 23:56

О каком примере метода вы имеете ввиду?

platedz 24.08.2012 12:37

var one =  { m: function(arg){alert("SW"+arg+this.s);}}	
	var two = { s: "sw"}
		one.m.bind(two)(" = ")


Насколько я понял, bind передает все свойства одного объекта другому.
Как если бы s была внутри one
var one =  { s: "sw", m: function(arg){alert("SW"+arg+this.s);}}

При этом к самим свойствам можно обратиться через this, но нельзя обратиться через название самого объекта. тк. one.s

А вот такая запись мне уже непонятна,

result[method]=f.bind(topmenu, result[method]);

Можно какой-нибудь упрощенный пример такой записи. Буду крайне признателен.

oneguy 24.08.2012 17:21

Цитата:

Сообщение от platedz
Насколько я понял, bind передает все свойства одного объекта другому.

Совершенно неверно. bind не передаёт никаких свойств объектов. Он привязывает аргументы к функции.
Инструкция
one.m.bind(two)(" = ") //bind привязывает объект two в качестве аргумента this к функции one.m

эквивалентна
one.m.call(two, " = ")

Пример:
var one =  { m: function(arg){alert("SW"+arg+this.s);
  alert(JSON.stringify(this));
  alert(this===two);}}
    var two = { s: "sw"}
        one.m.bind(two)(" = ")

Как видим, при вызове функции, возвращаемой выражением one.m.bind(two) аргумент this принимает значение, равное two.

platedz 24.08.2012 22:15

К сожалению в терминалогии слаб. Пришлось поинтересоваться в том, что такое аргумент.
Насколько я понимаю, аргумент это своего рода переменная, передаваемая через функцию. func(arg1,arg2) доступная внутри функции.
Соответственно bind передает дополнительные агрументы в функцию, но не сами аргументы, а ссылку на аргументы, обратиться к которым можно через this.
Т.е. мы расширяем функцию, как бы передая ей дополнительные аргументы.
Я правильно понимаю, или нет?

oneguy 24.08.2012 23:35

Уже ближе, но не совсем правильно.
Аргументы - это значения (языковые значения), которые передаются функции при её вызове. В некоторых других языках программирования в функцию могут передаваться переменные, но Джаваскрипт умеет передавать только значения.
Что касается объектов, то именно ссылки на объект являются языковыми значениями, сами объекты ими не являются.
Кроме обычных аргументов в функцию передаётся также аргумент this, который доступен внутри функции под ключевым словом this.
bind привязывает к функции некоторые значения: один из них используется в качестве аргумента this, остальные (есть они есть) - в качестве обычных аргументов.
function f(a, b, c) {
  alert(this+" "+a+" "+b+" "+c);
}
var g=f.bind(42, 1, 2); // привязываем 42 в качестве this; 1, 2 в качестве обычных аргументов
g(3); // 3 - новый аргумент в функцию f
g.call(43, 3); //переданный явно аргумент this игнорируется

Привязанные аргументы хранятся при новой функции (возвращённой bind, в данном примере - g), старая функция (f) ничего не знает ни о них, ни о новой функции (g).

platedz 25.08.2012 00:03

Большое спасибо за пояснение. Пока буду считать, что все-таки суть понял. Остальное дело времени и практики.


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