|
|
|
| Вот код:
v=1;
var foo = {bar: function () {alert(this.v);}, v:2};
foo.bar(); // 2
(foo.bar)(); // 2
(foo.bar = foo.bar)(); // 1
(false || foo.bar)(); // 2
(foo.bar, foo.bar)(); // 1
|
Почему он в последовательно выводит 22121, хотя должен бы 22222? Вот здесь - http://dmitrysoshnikov.com/ecmascript/ru-chapter-3-this/#tip-reference сказано, что это из-за того, что если вызывается значение не ссылочного типа, то this равно null, а следовательно global. Но я не могу понять, почему оператор присваивания возвращает значение не типа reference? И почему та же запятая, возвращает значение, а не ссылку? Ведь функция - это ссылочный тип, как и любой другой объект, а значит (foo.bar = foo.bar)(); должно вызвать по ссылке и установить this в значение foo... | |
|
|
|
|
|
|
|
для: dump
(24.07.2012 в 12:12)
| | У меня 22121 выдаёт только в Opera-12
В MSIE-8, FF-14 и CG-20 выводится 22111
-----
Расскажите, пожалуйста, а зачем вам все эти (практически никогда и никем не используемые) фичи/баги (они же - "тонкости") языка?
Просто интересно. | |
|
|
|
|
|
|
|
для: ЯСА
(25.07.2012 в 00:23)
| | Чтобы глубже знать язык, потому что не зная этих тонкостей впоследствии всплывают подводные камни в виде уязвимостей, прочих багов, непонимания того, как работает код.
А вы знаете почему Opera-12 выдаёт 2? | |
|
|
|
|
|
|
|
для: dump
(25.07.2012 в 10:32)
| | Нет, не знаю.
Могу только догадываться и предполагать, что связано это с тем, что следующий код:
<html>
<body>
<ol>
<script>
var _ABCDEF = 2;
for (var x in window) document.write ('<li>' + x + '</li>');
</script>
</ol>
</body>
</html>
|
выдаёт:
в Opera-12 -- 77 свойств и методов объекта window (включая _ABCDEF);
в FF-14 -- 178 - " - ;
в CG-20 -- 541 - " -;
а в MSIE-8 -- всего 40 и без _ABCDEF
------
Практические реализации JS в разных браузерах настолько отличаются, что изучать тонкости, кои вас заинтересовали, полагаю для себя бессмысленной потерей времени.
Но к попыткам других разобраться в этой "куче" отношусь с огромным уважением.
Мей би, им повезёт, и они среди этого мусора великолепия найдут ту самую жемчужину, коя мешает им понимать суть JS.
Которую мне, видимо, так никогда и не доведётся понять :-( | |
|
|
|
|
|
|
|
для: ЯСА
(25.07.2012 в 14:36)
| | >Которую мне, видимо, так никогда и не доведётся понять :-(
А почему вам не удаётся понять суть JS? В чём именно у вас проблемы? | |
|
|
|
|
|
|
|
для: dump
(25.07.2012 в 15:25)
| | Ну... полагаю, не я один не понимаю сути JS.
Прочтите статью http://javascript.crockford.com/popular.html, коя так и называется - "Самый неправильно понятый язык программирования в мире стал самым популярным в мире языком программирования"
Например, я, видимо, никогда не пойму, почему во всех браузерах:
// вот это не работает
(function () {eval ('var perem1 = 1')}) ();
alert (perem1);
// вроде бы логично - создаётся локальная переменная
// в глобале её и не должно быть видно
// а вот это - работает
(function () {eval ('var perem2 = 2'); alert (perem2)}) ();
// вроде бы тоже логично. Локальная переменная существует внутри функции, где создана
// но это вот работает (везде, кроме FF)
(function () {window.eval ('var perem3 = 3')}) ();
alert (perem3);
// переменная ведь всё же локальная. Не должна быть видна в глобале.
// да, метод её создания насильно привязали к window (хотя он и так должен быть к нему САМ привязан).
// но переменная от этого глобальной ведь не стала...
// у нас, что, только один браузер "правильный"?
// и вот это работает
eval ('var perem4 = 4');
alert (perem4);
// здесь создаём глобальную, её же и видим
|
| |
|
|
|