foo=func vs window['bar']=func
От: rFLY  
Дата: 12.04.18 11:04
Оценка:
Кто пояснит в чем разница между двумя этими функциями?
function foo () {
    console.log('foo 1:', foo === window['foo']);
    foo = function () {
        console.log('foo 2:', foo === window['foo']);
        console.trace();
    }
}
function bar () {
    console.log('bar 1:', bar === window['bar']);
    window['bar'] = function () {
        console.log('bar 2:', bar === window['bar']);
        console.trace();
    }
}


При первом запуске:

foo()
console.log > foo 1: true

bar()
console.log > bar 1: true


При повторном:

foo()
console.log > foo 2: true
console.trace > foo

bar()
console.log > bar 2: true
console.trace > window.bar

Почему так (выделенно) если обе глобальные и обе добавляются свойствами к window?
Re: foo=func vs window['bar']=func
От: sambl74 Россия  
Дата: 24.04.18 08:36
Оценка:
Здравствуйте, rFLY, Вы писали:

FLY>Почему так (выделенно) если обе глобальные и обе добавляются свойствами к window?


Так первая функция же не добавляется. Это просто объявленная переменная и windows она не имеет никакого отношения.
Re: foo=func vs window['bar']=func
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.04.18 08:43
Оценка:
Здравствуйте, rFLY, Вы писали:

FLY>Почему так (выделенно) если обе глобальные и обе добавляются свойствами к window?


window['x']= это вызов свойства объекта window. При обычном объявлении функции это свойство не вызывается напрямую. То есть, связывание работает по разному.
Re: sambl74, Ikemefula, правильно ли я понял
От: rFLY  
Дата: 24.04.18 10:19
Оценка:
Здравствуйте, rFLY, Вы писали:

FLY>
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 можно вызвать или она удаляется сборщиком мусора или что с ней происходит?
Re[2]: sambl74, Ikemefula, правильно ли я понял
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.04.18 18:32
Оценка:
Здравствуйте, rFLY, Вы писали:

FLY>В обоих случаях при объявлении функции ссылка на ней помещается в свойство window.


Каким именно способом помещается ?

FLY>Но в первом случае значение переменной foo перезаписывается, но сслыка на foo остается в свойстве window. В итоге вызвать можно как foo() так и window['foo']().

FLY>Во втором же случае в свойство window помещается ссылка на новую функцию. Что тогда происходит с ранее объявленной переменной bar? Оригинальную bar можно вызвать или она удаляется сборщиком мусора или что с ней происходит?

В обоих случаях ты перезаписываешь ссылку. В обоих случаях оригинальная версия убирается сборкой мусора. Разница только в том, вызывается ли сеттер явно или же связывание делается другим способом.
Re[3]: sambl74, Ikemefula, правильно ли я понял
От: rFLY  
Дата: 24.04.18 19:39
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Каким именно способом помещается ?

Судя по этому сразу после объявления функции (то есть ещё до перезаписи)
console.log('foo 1:', foo === window['foo'])


I>В обоих случаях ты перезаписываешь ссылку. В обоих случаях оригинальная версия убирается сборкой мусора. Разница только в том, вызывается ли сеттер явно или же связывание делается другим способом.

Так в том то и вопрос. Если в обоих случаях бровсером, оговорюсь — на вид, проделывается одно и тоже, то почему разница и во втором случае вызов происходит через свойство window. И как это можно применить? Ну то есть в каких случаях предпочтителен первый способ, а в каких второй. Или наоборот в чем может возникнуть проблема при использовании одного и второго.
Re: foo=func vs window['bar']=func
От: anonymous Россия http://denis.ibaev.name/
Дата: 25.04.18 08:47
Оценка: 1 (1)
Здравствуйте, rFLY, Вы писали:

FLY>Кто пояснит в чем разница между двумя этими функциями?


Формально разница в том, что window не обязано быть глобальным объектом, хотя в браузерах это всегда так.
Re[4]: sambl74, Ikemefula, правильно ли я понял
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.04.18 10:37
Оценка:
Здравствуйте, rFLY, Вы писали:

FLY>Здравствуйте, Ikemefula, Вы писали:


I>>Каким именно способом помещается ?

FLY>Судя по этому сразу после объявления функции (то есть ещё до перезаписи)
FLY>
FLY>console.log('foo 1:', foo === window['foo'])
FLY>


Это ответ на вопрос "когда". Помещается посредством прямой записи в объект window. Window это объект DOM, к JavaScript VM он не имеет никакого отношения, это разные и независимые сущности, которые всего лишь коммуницируют друг с другому.

I>>В обоих случаях ты перезаписываешь ссылку. В обоих случаях оригинальная версия убирается сборкой мусора. Разница только в том, вызывается ли сеттер явно или же связывание делается другим способом.

FLY>Так в том то и вопрос. Если в обоих случаях бровсером, оговорюсь — на вид, проделывается одно и тоже, то почему разница и во втором случае вызов происходит через свойство window. И как это можно применить? Ну то есть в каких случаях предпочтителен первый способ, а в каких второй. Или наоборот в чем может возникнуть проблема при использовании одного и второго.

Я же сказал:
window['bar'] =


Вот это явная записть в объект window. Именно эта строчка делает всю магию.
Re[2]: foo=func vs window['bar']=func
От: rFLY  
Дата: 25.04.18 19:52
Оценка:
Здравствуйте, anonymous, Вы писали:

A>Формально разница в том, что window не обязано быть глобальным объектом, хотя в браузерах это всегда так.

Доходчиво. Спасибо
Re[5]: sambl74, Ikemefula, правильно ли я понял
От: rFLY  
Дата: 25.04.18 20:00
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, rFLY, Вы писали:


I>Это ответ на вопрос "когда". Помещается посредством прямой записи в объект window. Window это объект DOM,

Если верить этому то window и над DOM, и над BOM, и над яваскриптом.

I>к JavaScript VM он не имеет никакого отношения, это разные и независимые сущности, которые всего лишь коммуницируют друг с другому.

А кто утверждает обратное?

I>Я же сказал:

I>
I>window['bar'] = 
I>


I>Вот это явная записть в объект window. Именно эта строчка делает всю магию.

Яснее (почему в обоих случаях сделано не аналагично) не стало, но спасибо. Тут ниже пояснили.
Re[6]: sambl74, Ikemefula, правильно ли я понял
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 26.04.18 12:17
Оценка:
Здравствуйте, rFLY, Вы писали:

I>>Я же сказал:

I>>
I>>window['bar'] = 
I>>


I>>Вот это явная записть в объект window. Именно эта строчка делает всю магию.

FLY>Яснее (почему в обоих случаях сделано не аналагично) не стало, но спасибо. Тут ниже пояснили.

В одном случае ссылка удерживается явно объектом window, т.е. ты присвоил, а в другом случае window не содержит ссылки на функцию, но зато умеет резолвить глобальные имена в JS по требованию.
Re[7]: sambl74, Ikemefula, правильно ли я понял
От: rFLY  
Дата: 26.04.18 13:24
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>В одном случае ссылка удерживается явно объектом window, т.е. ты присвоил, а в другом случае window не содержит ссылки на функцию, но зато умеет резолвить глобальные имена в JS по требованию.

Значит ли это что в первом (когда удерживается объектом) случае скрипт будет выполняться быстрее? Хм.. надо будет посмотреьть.
Re[8]: sambl74, Ikemefula, правильно ли я понял
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 26.04.18 19:40
Оценка:
Здравствуйте, rFLY, Вы писали:

FLY>Значит ли это что в первом (когда удерживается объектом) случае скрипт будет выполняться быстрее? Хм.. надо будет посмотреьть.


Нет, не значит. Скорость зависит от качества работы джита. Виндоу здесь ничего не меняет.
Re: foo=func vs window['bar']=func
От: maxkar  
Дата: 01.05.18 21:18
Оценка: 15 (1)
Здравствуйте, 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>" — не очень полезно для нахождения функции в исходном коде. Текущее решение тоже не идеал, но для типичного кода работает.
Re[2]: foo=func vs window['bar']=func
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.05.18 15:48
Оценка:
Здравствуйте, maxkar, Вы писали:

M>Вся разница — в контексте (коде) определения функции. И причина разного вывода — попытка сгенерировать что-нибудь удобное для идентификации анонимных функций в stacktrace. Потому что "<anonymousFunction123>" — не очень полезно для нахождения функции в исходном коде. Текущее решение тоже не идеал, но для типичного кода работает.


Век живи, век учись. А я всегда думал это window так себя ведет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.