Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Почему некоторые операторы возвращают значения, а не ссылки?
 
 автор: dump   (24.07.2012 в 12:12)   письмо автору
 
 

Вот код:


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...

  Ответить  
 
 автор: ЯСА   (25.07.2012 в 00:23)   письмо автору
 
   для: dump   (24.07.2012 в 12:12)
 

У меня 22121 выдаёт только в Opera-12

В MSIE-8, FF-14 и CG-20 выводится 22111
-----

Расскажите, пожалуйста, а зачем вам все эти (практически никогда и никем не используемые) фичи/баги (они же - "тонкости") языка?
Просто интересно.

  Ответить  
 
 автор: dump   (25.07.2012 в 10:32)   письмо автору
 
   для: ЯСА   (25.07.2012 в 00:23)
 

Чтобы глубже знать язык, потому что не зная этих тонкостей впоследствии всплывают подводные камни в виде уязвимостей, прочих багов, непонимания того, как работает код.

А вы знаете почему Opera-12 выдаёт 2?

  Ответить  
 
 автор: ЯСА   (25.07.2012 в 14:36)   письмо автору
 
   для: 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.
Которую мне, видимо, так никогда и не доведётся понять :-(

  Ответить  
 
 автор: dump   (25.07.2012 в 15:25)   письмо автору
 
   для: ЯСА   (25.07.2012 в 14:36)
 

>Которую мне, видимо, так никогда и не доведётся понять :-(

А почему вам не удаётся понять суть JS? В чём именно у вас проблемы?

  Ответить  
 
 автор: ЯСА   (25.07.2012 в 15:40)   письмо автору
 
   для: 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);
// здесь создаём глобальную, её же и видим

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования