Здравствуйте, rFLY, Вы писали:
FLY>Кто пояснит в чем разница между двумя этими функциями?
В коде тут дело. И window совсем даже ни при чем. Исследуйте:
var x = {a : { b : { c : [1, 2, 3] }}}
x.a.b.d = function() { console.trace() }
function id(x) { return x; }
x.a.b.c[2] = id(function() { console.trace(); })
var p = x.a.b.d;
var q = x.a.b.c[2];
delete x.a;
p();
q();
Вся разница — в контексте (коде) определения функции. И причина разного вывода — попытка сгенерировать что-нибудь удобное для идентификации анонимных функций в stacktrace. Потому что "<anonymousFunction123>" — не очень полезно для нахождения функции в исходном коде. Текущее решение тоже не идеал, но для типичного кода работает.
Здравствуйте, rFLY, Вы писали:
FLY>Почему так (выделенно) если обе глобальные и обе добавляются свойствами к window?
window['x']= это вызов свойства объекта window. При обычном объявлении функции это свойство не вызывается напрямую. То есть, связывание работает по разному.
FLY>function foo () {
FLY> foo = function () { }
FLY>}
FLY>function bar () {
FLY> window['bar'] = function () { }
FLY>}
FLY>
В обоих случаях при объявлении функции ссылка на ней помещается в свойство window.
Но в первом случае значение переменной foo перезаписывается, но сслыка на foo остается в свойстве window. В итоге вызвать можно как foo() так и window['foo']().
Во втором же случае в свойство window помещается ссылка на новую функцию. Что тогда происходит с ранее объявленной переменной bar? Оригинальную bar можно вызвать или она удаляется сборщиком мусора или что с ней происходит?
Здравствуйте, rFLY, Вы писали:
FLY>В обоих случаях при объявлении функции ссылка на ней помещается в свойство window.
Каким именно способом помещается ?
FLY>Но в первом случае значение переменной foo перезаписывается, но сслыка на foo остается в свойстве window. В итоге вызвать можно как foo() так и window['foo'](). FLY>Во втором же случае в свойство window помещается ссылка на новую функцию. Что тогда происходит с ранее объявленной переменной bar? Оригинальную bar можно вызвать или она удаляется сборщиком мусора или что с ней происходит?
В обоих случаях ты перезаписываешь ссылку. В обоих случаях оригинальная версия убирается сборкой мусора. Разница только в том, вызывается ли сеттер явно или же связывание делается другим способом.
Здравствуйте, Ikemefula, Вы писали:
I>Каким именно способом помещается ?
Судя по этому сразу после объявления функции (то есть ещё до перезаписи)
console.log('foo 1:', foo === window['foo'])
I>В обоих случаях ты перезаписываешь ссылку. В обоих случаях оригинальная версия убирается сборкой мусора. Разница только в том, вызывается ли сеттер явно или же связывание делается другим способом.
Так в том то и вопрос. Если в обоих случаях бровсером, оговорюсь — на вид, проделывается одно и тоже, то почему разница и во втором случае вызов происходит через свойство window. И как это можно применить? Ну то есть в каких случаях предпочтителен первый способ, а в каких второй. Или наоборот в чем может возникнуть проблема при использовании одного и второго.
Здравствуйте, rFLY, Вы писали:
FLY>Здравствуйте, Ikemefula, Вы писали:
I>>Каким именно способом помещается ? FLY>Судя по этому сразу после объявления функции (то есть ещё до перезаписи) FLY>
Это ответ на вопрос "когда". Помещается посредством прямой записи в объект window. Window это объект DOM, к JavaScript VM он не имеет никакого отношения, это разные и независимые сущности, которые всего лишь коммуницируют друг с другому.
I>>В обоих случаях ты перезаписываешь ссылку. В обоих случаях оригинальная версия убирается сборкой мусора. Разница только в том, вызывается ли сеттер явно или же связывание делается другим способом. FLY>Так в том то и вопрос. Если в обоих случаях бровсером, оговорюсь — на вид, проделывается одно и тоже, то почему разница и во втором случае вызов происходит через свойство window. И как это можно применить? Ну то есть в каких случаях предпочтителен первый способ, а в каких второй. Или наоборот в чем может возникнуть проблема при использовании одного и второго.
Я же сказал:
window['bar'] =
Вот это явная записть в объект window. Именно эта строчка делает всю магию.
Здравствуйте, anonymous, Вы писали:
A>Формально разница в том, что window не обязано быть глобальным объектом, хотя в браузерах это всегда так.
Доходчиво. Спасибо
Здравствуйте, Ikemefula, Вы писали:
I>Здравствуйте, rFLY, Вы писали:
I>Это ответ на вопрос "когда". Помещается посредством прямой записи в объект window. Window это объект DOM,
Если верить этому то window и над DOM, и над BOM, и над яваскриптом.
I>к JavaScript VM он не имеет никакого отношения, это разные и независимые сущности, которые всего лишь коммуницируют друг с другому.
А кто утверждает обратное?
I>Я же сказал: I>
I>window['bar'] =
I>
I>Вот это явная записть в объект window. Именно эта строчка делает всю магию.
Яснее (почему в обоих случаях сделано не аналагично) не стало, но спасибо. Тут ниже пояснили.
Здравствуйте, rFLY, Вы писали:
I>>Я же сказал: I>>
I>>window['bar'] =
I>>
I>>Вот это явная записть в объект window. Именно эта строчка делает всю магию. FLY>Яснее (почему в обоих случаях сделано не аналагично) не стало, но спасибо. Тут ниже пояснили.
В одном случае ссылка удерживается явно объектом window, т.е. ты присвоил, а в другом случае window не содержит ссылки на функцию, но зато умеет резолвить глобальные имена в JS по требованию.
Здравствуйте, Ikemefula, Вы писали:
I>В одном случае ссылка удерживается явно объектом window, т.е. ты присвоил, а в другом случае window не содержит ссылки на функцию, но зато умеет резолвить глобальные имена в JS по требованию.
Значит ли это что в первом (когда удерживается объектом) случае скрипт будет выполняться быстрее? Хм.. надо будет посмотреьть.
Здравствуйте, rFLY, Вы писали:
FLY>Значит ли это что в первом (когда удерживается объектом) случае скрипт будет выполняться быстрее? Хм.. надо будет посмотреьть.
Нет, не значит. Скорость зависит от качества работы джита. Виндоу здесь ничего не меняет.
Здравствуйте, maxkar, Вы писали:
M>Вся разница — в контексте (коде) определения функции. И причина разного вывода — попытка сгенерировать что-нибудь удобное для идентификации анонимных функций в stacktrace. Потому что "<anonymousFunction123>" — не очень полезно для нахождения функции в исходном коде. Текущее решение тоже не идеал, но для типичного кода работает.
Век живи, век учись. А я всегда думал это window так себя ведет.