Каково различие между использованием var и этим в JavaScript?

Каково различие между ними?

var a = 13;  
this.b = 21;  
document.write(a);  
document.write(b);
7
задан Kevin Panko 25 June 2010 в 17:09
поделиться

2 ответа

Для глобального кода (кода, который не является частью какой-либо функции) они почти эквивалент, оба в конце создают свойство глобального объекта.

Разница в том, что 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 неявно устанавливается при вызове функции, оно определяется тем, как вы ее вызываете:

  1. Когда вы используете оператор new , это значение внутри функции будет указывать на вновь созданный объект, например:

     function Test () {
    this.foo = "бар";
    }
    var obj = новый тест (); // новый объект со свойством `foo`
    
  2. Когда вы вызываете функцию, которая является членом объекта, значение this внутри этой функции будет указывать на базовый объект , например:

     var obj = {
    foo: function () {
    вернуть это == obj;
     }
    };
    obj.foo (); // правда
    
  3. Когда вы вызываете функцию без какого-либо базового объекта, значение this будет относиться к глобальному объекту:

     function test () {
    вернуть это == окно;
    }
    тестовое задание(); // правда
    
  4. Значение this можно задать явно, когда вы вызываете функцию с помощью call или apply :

     function test () {
    предупреждение (это);
    }
    test.call («привет, мир!»); // предупреждает "привет, мир!"
    
17
ответ дан 6 December 2019 в 10:47
поделиться

Короче говоря, если вы используете их в функции, то -

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

1
ответ дан 6 December 2019 в 10:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: