Вопрос о переменной переменной JavaScript: вари или нет - PullRequest
3 голосов
/ 24 декабря 2009

Большое спасибо заранее. Я работаю из учебника, и они используют одну функцию для вызова другой, которая открывает окно:

function rtest(){
   content='dans window';
   oneWindow=open("","Window 1","width=450,height=290");
   newWindow(oneWindow);
}
function newWindow(x){
   x.document.close();
   x.document.open();
   x.document.write(content);
   x.document.close();
   x.moveTo(20,20);
   x.focus();
}

Так что все работает нормально, но у меня такой вопрос: как функция newWindow () может получить доступ к содержимому переменной «contents» в функции rtest ()? И почему, если я предваряю переменную «content» с помощью «var», вот так:

function rtest(){
  **var content='dans window';**
  oneWindow=open("","OneWindow","width=450,height=290");
  newWindow(oneWindow);
}

... выдается ошибка (и содержимое нового окна остается пустым)?

Кто-нибудь может мне объяснить, в чем разница между использованием var и не использованием var?

Спасибо!

Daniel

Ответы [ 5 ]

6 голосов
/ 24 декабря 2009

если вы не используете var внутри rtest, это автоматически глобальная переменная. Именно поэтому он доступен из других кодов JavaScript, включая NewWindow. теперь, когда вы используете var, она автоматически становится переменной внутри области rtest, поэтому те, кто может ее использовать, теперь находятся внутри одной области.

5 голосов
/ 24 декабря 2009

Если вы объявите переменную, используя var внутри исходной функции, она станет локальной переменной и не будет видна за пределами функции.

Если вы вообще не объявите переменную, она будет глобальной. Однако лучше всего объявлять глобальные переменные. Если ваш учебник этого не делает, подумайте о его замене. Если ваш профессор не делает этого, подумайте о замене (или реформировании) его. :-) Если вам трудно убедить его, вы можете (но не обязательно) упомянуть, что я один из 200 лучших пользователей здесь.

Например:

var content;

function rtest(){
    content='dans window';
    oneWindow=open("","Window 1","width=450,height=290");
    newWindow(oneWindow);
}

Кроме того, лучший способ открыть пустое окно - вызвать open("about:blank", ...), а не open("", ...).

2 голосов
/ 24 декабря 2009

Если вы не используете var, то вы создаете глобальную переменную ; переменная, которая доступна из любого кода в любой точке вашей программы. Если вы используете var, вы создаете локальную переменную , которая является переменной, доступной только из scope , в котором она определена (обычно это функция определено в).

Хотя поначалу глобальные переменные могут быть удобны, обычно их использование является плохой идеей. Проблема в том, что весь ваш код будет использовать одну глобальную переменную; в будущем, если по какой-либо причине вам понадобятся две или более разных версий этой переменной, вы не сможете разделить эти два использования. Глобальные переменные также могут быть доступны или изменены из любого места в вашей программе, поэтому может быть трудно определить, что может быть изменено или зависит от одной, в то время как локальные переменные могут быть доступны только в пределах ограниченного, четко определенного раздела в коде, который может легко проверяется.

2 голосов
/ 24 декабря 2009

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

Если вы не используете оператор var и делаете присвоение необъявленному идентификатору (необъявленное присваивание), переменная будет добавлена ​​как свойство объекта Global.

1 голос
/ 24 декабря 2009

С помощью var вы объявляете локальную переменную в функции, которая, таким образом, не видна за пределами этой функции. Без var вы фактически работаете с объектом окна и устанавливаете или перезаписываете его поле. Ваша глобальная область в Javascript на стороне клиента всегда является объектом окна. Таким образом, вы могли бы также написать window.content = 'dans window'; чтобы прояснить, что вы на самом деле делаете там, но в противном случае это было бы идентично. Кстати, переменная окна сама по себе является просто полем объекта окна, который рекурсивно ссылается на окно.

...