Javascript var vs this

Если мой код выглядит так, какой предпочтительный метод использования var vs this?

function MyObject() {
    var self = this;

    var a = 1;
    this.b = 2;

    var innerMethod = function() {

        logMessage(a); 
        logMessage(self.b); 
    }
}

Как я понимаю, var будет выживать до тех пор, пока MyObject живет, так разве это не так, как с этим?

EDIT:

Чтобы уточнить этот вопрос, я ТОЛЬКО интересуюсь доступом к переменным изнутри объекта, а не извне.

Ответ 1

с var a вы не можете получить доступ к переменной за пределами области видимости, однако присвоение с помощью this может быть доступно при создании объекта

Мы добавляем свойства к this, когда хотим, чтобы свойства существовали с жизнью объекта. Мы используем var для локальных переменных.

"Я ТОЛЬКО интересуюсь доступом к переменным изнутри объекта, а не снаружи".

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

так как Шомз предложил вам проверить это как:

var o = new MyObject();

a будет undefined, поскольку он определяется с помощью var

  o.a; // undefined

в то время как b будет возвращать 2, так как он находится на this

 o.b; // 2

Ответ 2

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

Если вы определяете переменную как свойство (this.name), то она доступна извне.

То же самое касается функций. Функции, объявленные внутри области действия функции, но не привязанные к свойству, видны только внутри. Если вы назначаете функцию для свойства, вы можете получить доступ к этой функции извне (пока свойство продолжает указывать на эту функцию).

function Person(){

    // Declared variable, function scope
    var name = "John";          

    // Property        
    this.surname = "Doe";       

    // Assign anonymous function to property
    this.getName = function(){  
        return name;
    }

    // Assign anonymous function to property
    this.getSurname = function(){ 
        return this.surname;
    }

    // Declare function
    function saluteCasually(){      
        console.log("Hi folks!");
    }

    // Declare function
    function salutePolitely(){          
        console.log("Nice to meet you");
    }

    // Assign (not anonymous) function to property
    this.salutePolitely = salutePolitely;

}

var person = new Person();

console.log(person.name);           // undefined
console.log(person.getName());      // "John"
console.log(person.surname);        // "Doe"
console.log(person.getSurname());   // "Doe"

person.saluteCasually(); // Error: person has not a property "saluteCasually".
person.salutePolitely(); // Prints "Nice to meet you";

person.salutePolitely = function(){ // Properties can be messed with from anywhere!
    console.log("Bananas");
}
person.salutePolitely(); // Prints "Bananas";

Ответ 3

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

, как сказано в документации по анализу памяти 101 в документации по хромовым devtools:

Память может удерживаться объектом двумя способами: непосредственно самим объектом и неявно, удерживая ссылки на другие объекты и тем самым не позволяя им автоматически удаляться сборщиком мусора (короткое замыкание).

Размер памяти, удерживаемой самим объектом, называется мелким размером. У типичных объектов JavaScript есть память, зарезервированная для их описания и для хранения мгновенных значений.

Обычно только массивы и строки могут иметь значительные мелкие размеры. Тем не менее, строки часто имеют основное хранилище в памяти рендерера, отображая только небольшой объект-оболочку в куче JavaScript.

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

Devtools Docs

Ответ 4

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

function MyObject() {
    var self = this;

    var a = 1;
    this.b = 2;

    var innerMethod = function() {

        logMessage(a); 
        logMessage(self.b); 
    }
}

var o = new MyObject();
console.log(o.a); // undefined
console.log(o.b); // 2