Каково различие между ними?
var a = 13;
this.b = 21;
document.write(a);
document.write(b);
Для глобального кода (кода, который не является частью какой-либо функции) они почти эквивалент, оба в конце создают свойство глобального объекта.
Разница в том, что a
, который был объявлен с помощью оператора var
, процесс Variable Instantiation будет использовать глобальный объект в качестве Переменный объект (1) , и он определит это свойство как не подлежащее удалению, например:
var a = 13;
delete a; // false
typeof a; // "number"
Затем b
, поскольку значение this
в глобальный код, указывающий на сам глобальный объект, также будет глобальным свойством , но его можно удалить:
this.b = 21;
delete b; // true
typeof b; // "undefined"
Не пробуйте первый фрагмент в Firebug, так как консоль Firebug запускает код внутренне с помощью eval
, и в этом контексте выполнения процесс создания экземпляра переменной ведет себя иначе, вы можете попробовать его здесь .
(1) Объект переменной (VO) - это объект, который используется процессом создания экземпляра переменной для определения идентификаторов FunctionDeclarations, идентификаторов, объявленных с помощью операторов var
, и идентификаторов функции. формальные параметры, в различных контекстах выполнения , все эти идентификаторы связаны как свойства VO, цепочка Scope формируется из списка VO.
Для глобального кода VO является самим глобальным объектом, поэтому a
в конечном итоге является его свойством. Для функционального кода VO ( также известный как Activation Object для FunctionCode ) - это новый объект, который создается за кулисами, когда вы вызываете функцию, и это то, что создает новая лексическая область видимости, вкратце расскажу о функциях.
И a
, и this.b
могут быть разрешены просто, как a
и b
, потому что Первый объект в цепочке областей видимости снова является глобальным объектом.
Кроме того, я думаю, это работа, зная, что процесс создания переменной происходит до , чем выполнение кода, например:
alert(a); // undefined, it exists but has no value assigned to it yet
alert(b); // ReferenceError is thrown
var a = 13;
this.b = 21;
Эти различия могут быть тривиальными, но я думаю, что их стоит знать.
Теперь, если опубликованный вами фрагмент кода находится внутри функции, он совершенно другой .
Идентификатор a
, объявленный с помощью оператора var
в вашем примере, будет локальной переменной , доступной только для лексической области видимости функции (и любые вложенные функции).
Имейте в виду, что в блоках JavaScript не вводят новую область видимости, а только функции, и чтобы объявить переменную в этой области, вы должны всегда использовать var
.
Идентификатор this.b
станет свойством, привязанным к объекту, на который ссылается значение this
, но ... Что такое this
??? .
Значение this
в JavaScript неявно устанавливается при вызове функции, оно определяется тем, как вы ее вызываете:
Когда вы используете оператор new
, это
значение внутри функции будет указывать на вновь созданный объект, например:
function Test () {
this.foo = "бар";
}
var obj = новый тест (); // новый объект со свойством `foo`
Когда вы вызываете функцию, которая является членом объекта, значение this
внутри этой функции будет указывать на базовый объект , например:
var obj = {
foo: function () {
вернуть это == obj;
}
};
obj.foo (); // правда
Когда вы вызываете функцию без какого-либо базового объекта, значение this
будет относиться к глобальному объекту:
function test () {
вернуть это == окно;
}
тестовое задание(); // правда
Значение this
можно задать явно, когда вы вызываете функцию с помощью call
или apply
:
function test () {
предупреждение (это);
}
test.call («привет, мир!»); // предупреждает "привет, мир!"
Короче говоря, если вы используете их в функции, то -
this.a; //will create a public property
var b; //will create a member variable
например. вот класс Student в javascript
var Student = function()
{
// Member variable
var studentId;
// Public property
this.Name = "";
}
для получения дополнительной информации - см. Объектно-ориентированное программирование с помощью JavaScript