Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Создание примитива с таким же именем как у уже существующего свойства функции (https://javascript.ru/forum/misc/40224-sozdanie-primitiva-s-takim-zhe-imenem-kak-u-uzhe-sushhestvuyushhego-svojjstva-funkcii.html)

lancer 28.07.2013 22:28

Создание примитива с таким же именем как у уже существующего свойства функции
 
В примере ниже операция ++ сработает на локальной переменной test, а не на свойстве test объекта функции. Потому что test новая переменная, которая получила значение свойства, но никак не является ссылкой на свойство.

function test(){
    var test = arguments.callee.test;
    test++;
}


Каким свойством будет записана локальная переменная test, если свойство test у функции уже существует?

bes 28.07.2013 23:51

Цитата:

Сообщение от lancer
Каким свойством будет записана локальная переменная test, если свойство test у функции уже существует?

ты о чём вообще
локальная переменная будет хранить то, что ей присвоили, иначе undefined
написав arguments.callee.test ты уже обращаешься к свойству, в приведённом примере туда ляжет undefined (если ранее присвоишь другое значение, то оно)

http://es5.javascript.ru/x8.html#x8.12
Цитата:

При вызове внутреннего метода [[GetOwnProperty]] объекта O с именем свойства P выполняются следующие шаги:

1. Если у O нет собственного свойства с именем P, вернуть undefined.
...

dmitriymar 29.07.2013 00:47

Цитата:

Сообщение от lancer
Каким свойством будет записана локальная переменная test, если свойство test у функции уже существует?

слова: объект вызова о чём то говорят?

lancer 29.07.2013 01:04

Ну да, arguments.callee.test = 1, это аналогично var test = 1;
В учебнике тогда сырой пример, объясняется что если test = arguments.callee.test, а потом test++, то значение будет прибавленно именно у test, а не у arguments.callee.test. Я че и подумал, как могут быть два test. Там надо было написать как-то test_new = arguments.callee.test.

Если что тут, хотя как по мне вопрос исчерпан.
функции-объекты

dmitriymar, твой минус мне в карму "учи основы", так я их и учу, и не моя вина что в учебнике опечатка. Не хочешь помогать - не надо.

danik.js 29.07.2013 03:30

Цитата:

Сообщение от lancer
В учебнике тогда сырой пример, объясняется что если test = arguments.callee.test, а потом test++, то значение будет прибавленно именно у test, а не у arguments.callee.test.

Все правильно написано в учебнике. Так и есть.
Цитата:

Сообщение от lancer
Я че и подумал, как могут быть два test.

А почему нет? Ты создал локальную переменную test, у которой тут же задал начальное значение, равное значению arguments.callee.test.
Операции над test никак не повлияют на arguments.callee.test (с чего бы это)?

dmitriymar 29.07.2013 09:15

Цитата:

Сообщение от lancer
так я их и учу, и не моя вина что в учебнике опечатка

Нет там опечатки , учи основы , выучи что передаётся по ссылке , а что по значению и прочие основы и вопросов не будет и обвинений в "опечатках" . ты 5 лет на форуме
Цитата:

Сообщение от lancer
Не хочешь помогать - не надо.

-чувак это ты не хочешь вдумываться в то что тебе говорят, и изучить основы наконец
чего стоит "Создание примитива с таким же именем как у уже существующего свойства функции" -что такое примитив? что это за термин ?

lancer 29.07.2013 19:07

Цитата:

Сообщение от danik.js
Цитата:

Сообщение от lancer
В учебнике тогда сырой пример, объясняется что если test = arguments.callee.test, а потом test++, то значение будет прибавленно именно у test, а не у arguments.callee.test. Я че и подумал, как могут быть два test. Там надо было написать как-то test_new = arguments.callee.test.

Все правильно написано в учебнике. Так и есть.

Ниже этого раздела пишется, что переменная объявленная не через var попадает в свойство объекта window, я и подумал, что те что без var внутри функции попадают в arguments.callee. Ничего и не говориться потому что про них и выше как раз пример с arguments.callee - а раз ничего не говориться, я и сделал такие выводы.

dmitriymar, конечно спасибо за советы про что почитать, но не надо раньше времени делать выводы, учебник кривовато написан, об этом и в комментариях многие говорят. Насчет 5 лет - так 4 из них почти им не занимался.

Не знаю как тут поживает другой учебник, но вот тот, на который я дал ссылку даже нельзя назвать учебником - быстрая справка да и то убогая. Почему? Потому что совершенно не объясняется для чего все это служит, всего лишь говориться, есть это и это. Изредко только появляются хоть какие-то примеры на этот счет. Качайте учебник "Дэвид Флэнаган. Javascript. Подробное руководство. 6-е издание" .pdf. Сейчас почитал и понял, что это небо и земля.

Плохо, что понимаешь это когда уже намучаешься с недельку с сухим материалом и переспросишь по 10 раз очевидные детали.

bes 29.07.2013 20:23

Цитата:

Сообщение от lancer
что переменная объявленная не через var попадает в свойство объекта window, я и подумал, что те что без var внутри функции попадают в arguments.callee

ох-й вывод, самому не смешно

Цитата:

Сообщение от lancer
Не знаю как тут поживает другой учебник, но вот тот, на который я дал ссылку даже нельзя назвать учебником - быстрая справка да и то убогая. Почему? Потому что совершенно не объясняется для чего все это служит, всего лишь говориться, есть это и это. Изредко только появляются хоть какие-то примеры на этот счет

нет, lancer, учебник как раз не плохой, додумывать надо меньше подобным образом, а додуманное проверять

Цитата:

Сообщение от lancer
Качайте учебник "Дэвид Флэнаган. Javascript. Подробное руководство. 6-е издание" .pdf. Сейчас почитал и понял, что это небо и земля

вот тебе ближайший учебник http://es5.javascript.ru/, так как это исходный источник того, как должны работать основные конструкции языка (хотя лучше почитать в оригинале)


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