Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Что за ФИГНЯ?! У этого языка программирования логика вообще есть?! (https://javascript.ru/forum/misc/54626-chto-za-fignya-u-ehtogo-yazyka-programmirovaniya-logika-voobshhe-est.html)

tsigel 26.03.2015 10:30

Я не буду с тобой препираться более в этой теме. Это скучно. Можешь снова считать что ты победил.
newuser1001 - 100
tsigel - 0

newuser1001 26.03.2015 10:34

Цитата:

Сообщение от tsigel
ты победил.

с тобой это априори

jaroslav.tavgen 30.03.2015 00:11

Пытаюсь ещё раз понять:

Цитата:

Сообщение от tsigel (Сообщение 363046)
Это вообще 2 разных случая. Ещё раз. Если сейчас не поймете - прочтите ЦЕЛИКОМ статью которую я кинул.

Вот Ваш код:
<div id="id1" onclick="Function1()">Click on me</div>
<script>
"use strict"
var id1 = document.getElementById("id1");
id1.outerHTML = id1.outerHTML.replace('onclick="Function1()"', 'onclick="Function2()"');

alert(id1.outerHTML);

function Function1(){

    alert('Function1 is executed!');

}

function Function2(){

    alert('Function2 is executed!');

}


</script>


В строке 4 вы записали в переменную "id1" ссылку на елемент.

Да. Это значит, что теперь переменная id1 - это адрес объекта document.getElementById("id1"). А значит (поскольку указателей в javascript нету) каждый раз когда я обращаюсь к переменной id1, я работаю НАПРЯМУЮ с объектом document.getElementById("id1"). Всё, что я делаю с переменной id1, должно одновременно происходить с объектом document.getElementById("id1") и наоборот. Ведь переменная id1 и объект document.getElementById("id1") (а также document.getElementsByTagName("div")[0] и т.д.) - это два адреса, состоящих из 4-х байт. И они равны между собой.

Цитата:

Сообщение от tsigel (Сообщение 363046)
В строке 5 Вы УДАЛИЛИ тег на который ссылалась переменная "id1"

Именно.

id1.onclick = null
document.getElementById("id1").onclick = null
Цитата:

Сообщение от tsigel (Сообщение 363046)
(при этом не удаляя переменную)

id1.onclick = null
document.getElementById("id1").onclick = null
Цитата:

Сообщение от tsigel (Сообщение 363046)
, и СОЗДАЛИ НОВЫЙ тег, ссылку на который вы НИКУДА не записывали.

id1.onclick = null
document.getElementById("id1").onclick = null

Вот так я понимаю работу ссылок. В чём ошибка моего понимания?

Цитата:

Сообщение от tsigel (Сообщение 363046)
Оператор присвоения ("=") в данном случае никак не связан с вашей переменной! Он говорит чтобы вы записали НОВУЮ строку на место где находится Ваш элемент.

Честно говоря, эти два предложения вообще не понял.
Цитата:

Сообщение от tsigel (Сообщение 363046)
После того как строка записана браузер понимает что это тег.

А следовательно, и это тоже.

tsigel 30.03.2015 08:52

Цитата:

Сообщение от jaroslav.tavgen (Сообщение 363832)
Пытаюсь ещё раз понять:


Да. Это значит, что теперь переменная id1 - это адрес объекта document.getElementById("id1"). А значит (поскольку указателей в javascript нету) каждый раз когда я обращаюсь к переменной id1, я работаю НАПРЯМУЮ с объектом document.getElementById("id1"). Всё, что я делаю с переменной id1, должно одновременно происходить с объектом document.getElementById("id1") и наоборот.

Объекты передаются в js по ссылке. Это и есть указатели. Вы работаете не с объектом а с ссылкой на объект. Прочтите пример который я вам сделал на объектах и посты от [b]skrudjmakdak[\b]. Он круто расписал. С картинками.

tsigel 30.03.2015 08:57

<div id="id1" onclick="Function1()">Click on me</div>
<script>
"use strict"
var id1 = document.getElementById("id1");
id1.outerHTML = id1.outerHTML.replace('onclick="Function1()"', 'onclick="Function2()"');

alert(id1==document.getElementById("id1"));


</script>

jaroslav.tavgen 30.03.2015 23:39

tsigel, skrudjmakdak объясняет, что такое указатели в принципе. Я очень хорошо понимаю, что такое указатели... в Assembler и C. И не понимаю - что это такое в javascript.

В Ассемблере всё понятно: [0238A356] означает "два байта находящихся по адресам 0238A357 и 0238A356 соответственно, и именно в таком порядке".

В C чуть завихренистее, но тоже ясно: pointerVariable - это адрес. *pointerVariable - то, что находится по этому адресу.

А в javascript как?

Если id1 - это указатель, то я бы ожидал, что "alert(id1)" выдаст результат, скажем, "030BC123". Ибо указатель - это адрес.

Но в реальности мы имеем явно что-то другое. Что же именно?

MallSerg 31.03.2015 03:51

Цитата:

Сообщение от jaroslav.tavgen
Ибо указатель - это адрес.

Ты путаешь физический адрес с типом данных(указатель) и как следствие в голове у тебя каша не верных выводов.

В С С++ указатель это базовый тип данных описанный в спецификации который хранит в себе физический адрес.

Указатель javaScript больше всего похож на ссылочный тип данных в других языках т.е. имея ссылку на объект мы можем манипулировать им.
В JS нет такого типа данных как указать нет линейной адресации нет адресной арифметики.

Доступ к данным(адресация) в низкоуровневых языках реализуется с помощью линейно адресуемой физической памяти. в JavaScript используются высокоуровневая абстракция в виде двух древовидных структур( глобальная область видимости и текущий scope) которые позволяют манипулировать данными через имена переменных.
Каждое имя переменой или свойство объекта(что в принципе одно и то же) хранит в себе ссылку(указатель) на данные.
Любые операции кроме ( = && === ) будут работать со значением полученным по этой ссылке.
Присваивание для сложных типов всегда копирует ссылку на объект.
Присваивание для примитивных типов создает новый объект и копирует значение полученное по ссылке.
т.е. для доступа к данным (адресации)
в Ассемблере используется физический адрес - "030BC123"
в JavaScript имена разделенные точками - "wondow.document.body"

т.е. в каком то смысле "id1" в JS это то же самое что и "030BC123" в Assembler.


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