В чем разница между глобальными переменными и атрибутами оконного объекта? - PullRequest
4 голосов
/ 18 июля 2010

Я немного смущен объектом окна JavaScript. Для начала рассмотрим следующие два объявления:

var imglobal = "I'm Global";

window.imglobal = "I'm Global";

Насколько я понимаю, это было бы точно так же (не так ли?) К нему можно получить доступ как "imglobal" или "window.imglobal" в обоих случаях. Я не понимаю почему, var объявляет локальные переменные, следующее не работает:

function imafunc() {
  var imavar = "I'm a variable";
  window.alert(imafunc.imavar);
}

Так почему же следующее?

var imavar = "I'm a variable";
window.alert(window.imavar);

Я наткнулся на это при использовании GWT; кажется, что всегда нужно явно явно ссылаться на объект окна ($ wnd там), вероятно, потому что это не «настоящий» объект окна, а какая-то песочница.

Это становится еще более запутанным с функциями, я знаю три способа объявить их:

var myfunc = function() { window.alert("Hello, World!"); }

window.myfunc = function() { window.alert("Hello, World!"); }

function myfunc() { window.alert("Hello, World!"); }

Есть ли техническая разница между этими тремя подходами?

Ответы [ 3 ]

3 голосов
/ 18 июля 2010

О вашем наблюдении:

Я наткнулся на это при использовании GWT; кажется, что всегда нужно явно явно ссылаться на объект окна ($ wnd), потому что это не «настоящий» объект окна, а какая-то песочница.

Причина, по которой вам всегда нужно будет добавлять префикс к переменным и функциям к $ wnd в GWT JSNI, заключается в том, чтобы обеспечить доступ к переменной из области окна (главной страницы). Это связано с тем, что JSNI запускается внутри iframe, поэтому любая переменная без квалификатора $ wnd будет разрешаться в рамках iframe, а не в той области окна, которую вы намеревались.

2 голосов
/ 18 июля 2010

Нет различий между глобальными переменными и свойствами окна (по крайней мере, не так много;))

Последним scope в цепочке областей действия каждой функции является объект window. Поэтому каждое свойство объекта window доступно в любой функции без явной ссылки на window.

Обновление:

Я не понимаю, почему, var объявляет локальные переменные, следующее не работает:

 function imafunc() {
   var imavar = "I'm a variable";
   window.alert(imafunc.imavar);
 }

Вы не можете получить доступ к imafunc.imavar, потому что это не свойство функции. imavar - это свойство объекта активации , которое создается при выполнении функции и является «первой областью действия» в цепочке областей действия. Вы не можете получить к нему доступ напрямую.

1 голос
/ 18 июля 2010

Кстати, чтобы ваша функция работала, вы должны сделать imavar свойством функции:

function imafunc() {
  this.imavar = "I'm a variable";
  window.alert(imafunc.imavar);
}

Различие между вашими тремя функциями заключается в том, что только третья может вызываться до объявления в коде, остальные доступны только до присвоения переменной, поскольку они являются безымянными выражениями функций.

myfunc1() and myfunc2() //throws an error cause it isn't declared right now
myfunc3()//will alert(Hello, World!)

var myfunc1 = function() { window.alert("Hello, World!"); }
window.myfunc2 = function() { window.alert("Hello, World!"); }
function myfunc3() { window.alert("Hello, World!"); }

myfunc1()//will alert(Hello, World!)
myfunc2()//will alert(Hello, World!)

http://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...