Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   (function(){бла-бла-бла})() что это означает? (https://javascript.ru/forum/misc/24165-function-%7Bbla-bla-bla%7D-chto-ehto-oznachaet.html)

Livanderiaamarum 20.12.2011 15:41

хороший сайт)
http://dmitrysoshnikov.com/ecmascrip...hapter-3-this/

Nekromancer 20.12.2011 17:24

Livanderiaamarum,
Неужели :)

melky 20.12.2011 21:47

Цитата:

Сообщение от Livanderiaamarum (Сообщение 144755)

на закуску.

что вернёт данный код и почему?
(function(){
    return this[this];
}).call(1);


PS классная статья. кстати, я долго не мог понять, почему код отсюда будет возвращать не-Reference.
для этого нужно знать, как работают эти операторы.
(они вернут ЗНАЧЕНИЕ. т.е. =>)
foo = { bar : function(){alert(this);} };

(foo.bar = foo.bar)();
// eq to 
(function(){alert(this);})();

nerv_ 20.12.2011 22:26

Цитата:

Сообщение от melky
на закуску.

Аж чуть не подавился) Попробую, насколько позволит мозг :)
// вызов анонимной функции в контексте объекта
// call(1) -> call(Number) -> call(Object);
(function(){
	// вернуть св-во объекта вызова по имени объекта вызова
	// т.к. такого св-ва нет, то undefined
	return this[this];
}).call(1);

melky 20.12.2011 22:28

чему равен this, какое свойство он пытается получить и почему undefined собстно ?)

развёрнутей, с примерами кода :) представь, что ты обьясняешь ребёнку.
пока ты ПРОСТО не обьяснишь, я буду считать, что ты не понял. (так и есть - если человек понял материал, то он сможет его перефразировать, оставив суть и изменив изложение)

nerv_ 20.12.2011 22:43

Я понял так. А уж насколько правильно, эт Вы мне скажите)
// вызов анонимной функции в контексте объекта
// call(1) -> call(Number) -> call(Object);
(function() {
	// проверить тип объекта
	alert(this instanceof Number); // True
	alert(this == 1); // значение св-ва
	// вернуть св-во объекта вызова по имени объекта вызова
	// т.к. было создано безымянное св-во, то undefined
	return this[this];
}).call(1);

Nekromancer 20.12.2011 22:59

Цитата:

Сообщение от melky (Сообщение 144841)
чему равен this, какое свойство он пытается получить и почему undefined собстно ?)

this == ObjectWrapNumber;
this[this] == ObjectWrapNumber[ObjectWrapNumber.valueOf()];

Ну или просто - (1)[1] :)

melky 21.12.2011 00:12

nerv_, почти почти :)

Цитата:

Сообщение от Nekromancer (Сообщение 144850)
this == ObjectWrapNumber;
this[this] == ObjectWrapNumber[ObjectWrapNumber.valueOf()];

Цитата:

Сообщение от Nekromancer (Сообщение 144850)
(1)[1] :)

(1)['1']

узнаем тип ключа.
var foo = {}
foo[1] = "ok"; // ключ - number.
for(var i in foo) alert(typeof i); // string

в массивах так же.

PS. не могу никак найти соотв. раздел в спецификации. верьте наслово :)

Nekromancer 21.12.2011 01:11

melky,
А чего верить на слово то? Просто движок внутри себя вызывает функцию toString у объектов попадающих в квадратные скобки, когда таким образом обращаешься к массиву/объекту. А вот как раз туда передаётся то, что приходит по reference. Далее примерно такой псевдокод:
get function getByIndex(object){
return this[object.toString()] // ну или valueOf().toString() 
}
set function setByIndex(object, value){
return (this[object.toString()] = value);
}

Так что я не прав скорее с тем, что сразу передаётся valueOf, оно просто вычисляется во внутренней функции.
А конструкция тогда - ObjectWrapNumber[ObjectWrapNumber].

П.С. Что ключ в итоге всегда строка это и так понятно :)

B@rmaley.e><e 21.12.2011 01:20

Цитата:

Сообщение от melky
не могу никак найти соотв. раздел в спецификации

Какой раздел? О приведении ключей к строкам? Так вот же. (п. 6)

Livanderiaamarum 21.12.2011 04:25

Цитата:

Сообщение от Nekromancer (Сообщение 144778)
Livanderiaamarum,
Неужели :)

представьте себе именно это я и сказал))

nerv_ 21.12.2011 10:36

melky, спасибо) Кажется, понял, где я заплутал
for(var i in this) //не перечислимые св-ва

Nekromancer 21.12.2011 10:48

nerv_,
Тю, а это тут причём?)

nerv_ 21.12.2011 14:17

Nekromancer, я высказывал предположение, что было создано безымянное св-во ^_^
// вызов анонимной функции в контексте объекта
// call(1) -> call(Number) -> call(Object);
(function() {
	// проверить тип объекта
	alert(this instanceof Number); // True
	alert(this == 1); // значение св-ва
	
	for(var x in this) ; // неперечислимое св-во
	
	// вернуть св-во объекта вызова по имени объекта вызова
	// т.к. было создано безымянное св-во, то undefined <--
	return this[this];
}).call(1);

Nekromancer 21.12.2011 14:25

nerv_,
А как это строка может доказать, что мы свойство которое мы хотим запросить равно - undefined?
Я конечно предполагаю, что вы путаетесь в терминологии и называете значения свойства (1)[q], просто своством. Но всё же.
Строка:
for(var x in this) ;

лишь может доказать при правильном оформлении, что в нём нет перечисляемых свойств или есть.
А этот комментарий меня вообще убил:
// т.к. было создано безымянное св-во, то undefined <--

Кто то понял логику?

nerv_ 21.12.2011 14:39

Цитата:

Сообщение от Nekromancer
Я конечно предполагаю, что вы путаетесь в терминологии и называете значения свойства (1)[q], просто своством.

Все может быть) Изучаю js только 2-3 недели) Попробую внести ясность (как я себе это понимаю):
// создание объекта x и присвоение ему 2-х св-в
// первое: a со значением 1
// второе: b со значением undefined
var x = { a:1, b:undefined };
// перечислить св-ва объекта
for(var i in x) {
	alert(i); // св-во
	alert(x[i]); //значение св-ва
}

Цитата:

Сообщение от Nekromancer
А этот комментарий меня вообще убил:

// т.к. было создано безымянное св-во, то undefined <--

Да, сглупил) Это я цитировал себя от вчера)

Livanderiaamarum 21.12.2011 14:39

Цитата:

Сообщение от Nekromancer (Сообщение 144941)
Кто то понял логику?

я понял, тут типа логика если че-то не определено то выдавать нЕчего, то undefuned, что обычно ведет себя как "нет значения")) как то так

Nekromancer 21.12.2011 14:57

nerv_,
Ну сейчас цикр правильный, да :) Просто в том примере это не так проверка, которая нужна была.
Livanderiaamarum,
Неужели трудно нормально формировать свои мысли?
- Если свойство явно не определено или оно не было определено в цепочки прототипов, то возвращается базовое значение - undefined

Livanderiaamarum 21.12.2011 15:10

Цитата:

Сообщение от Nekromancer (Сообщение 144955)
nerv_,
Ну сейчас цикр правильный, да :) Просто в том примере это не так проверка, которая нужна была.
Livanderiaamarum,
Неужели трудно нормально формировать свои мысли?
- Если свойство явно не определено или оно не было определено в цепочки прототипов, то возвращается базовое значение - undefined

спасибо не знал)


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