хороший сайт)
http://dmitrysoshnikov.com/ecmascrip...hapter-3-this/ |
Livanderiaamarum,
Неужели :) |
Цитата:
что вернёт данный код и почему?
(function(){
return this[this];
}).call(1);
PS классная статья. кстати, я долго не мог понять, почему код отсюда будет возвращать не-Reference. для этого нужно знать, как работают эти операторы. (они вернут ЗНАЧЕНИЕ. т.е. =>)
foo = { bar : function(){alert(this);} };
(foo.bar = foo.bar)();
// eq to
(function(){alert(this);})();
|
Цитата:
// вызов анонимной функции в контексте объекта
// call(1) -> call(Number) -> call(Object);
(function(){
// вернуть св-во объекта вызова по имени объекта вызова
// т.к. такого св-ва нет, то undefined
return this[this];
}).call(1);
|
чему равен this, какое свойство он пытается получить и почему undefined собстно ?)
развёрнутей, с примерами кода :) представь, что ты обьясняешь ребёнку. пока ты ПРОСТО не обьяснишь, я буду считать, что ты не понял. (так и есть - если человек понял материал, то он сможет его перефразировать, оставив суть и изменив изложение) |
Я понял так. А уж насколько правильно, эт Вы мне скажите)
// вызов анонимной функции в контексте объекта
// call(1) -> call(Number) -> call(Object);
(function() {
// проверить тип объекта
alert(this instanceof Number); // True
alert(this == 1); // значение св-ва
// вернуть св-во объекта вызова по имени объекта вызова
// т.к. было создано безымянное св-во, то undefined
return this[this];
}).call(1);
|
Цитата:
this[this] == ObjectWrapNumber[ObjectWrapNumber.valueOf()]; Ну или просто - (1)[1] :) |
nerv_, почти почти :)
Цитата:
Цитата:
узнаем тип ключа.
var foo = {}
foo[1] = "ok"; // ключ - number.
for(var i in foo) alert(typeof i); // string
в массивах так же. PS. не могу никак найти соотв. раздел в спецификации. верьте наслово :) |
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]. П.С. Что ключ в итоге всегда строка это и так понятно :) |
Цитата:
|
Цитата:
|
melky, спасибо) Кажется, понял, где я заплутал
for(var i in this) //не перечислимые св-ва |
nerv_,
Тю, а это тут причём?) |
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);
|
nerv_,
А как это строка может доказать, что мы свойство которое мы хотим запросить равно - undefined? Я конечно предполагаю, что вы путаетесь в терминологии и называете значения свойства (1)[q], просто своством. Но всё же. Строка: for(var x in this) ; лишь может доказать при правильном оформлении, что в нём нет перечисляемых свойств или есть. А этот комментарий меня вообще убил: // т.к. было создано безымянное св-во, то undefined <-- Кто то понял логику? |
Цитата:
// создание объекта x и присвоение ему 2-х св-в
// первое: a со значением 1
// второе: b со значением undefined
var x = { a:1, b:undefined };
// перечислить св-ва объекта
for(var i in x) {
alert(i); // св-во
alert(x[i]); //значение св-ва
}
Цитата:
// т.к. было создано безымянное св-во, то undefined <-- Да, сглупил) Это я цитировал себя от вчера) |
Цитата:
|
nerv_,
Ну сейчас цикр правильный, да :) Просто в том примере это не так проверка, которая нужна была. Livanderiaamarum, Неужели трудно нормально формировать свои мысли? - Если свойство явно не определено или оно не было определено в цепочки прототипов, то возвращается базовое значение - undefined |
Цитата:
|
| Часовой пояс GMT +3, время: 10:25. |