如果我的代码看起来像这样,那么使用var vs this的首选方法是什么?
function MyObject() {
var self = this;
var a = 1;
this.b = 2;
var innerMethod = function() {
logMessage(a);
logMessage(self.b);
}
}
据我所知,只要MyObject存在,var就会存活下来,所以这与使用它一样吗?
编辑:
为了更清楚地澄清这个问题,我只对从对象内部而不是从外部访问变量感兴趣。
答案 0 :(得分:18)
使用var a
您无法访问范围之外的变量,但是在创建对象时可以访问使用this
进行分配
当我们希望属性与对象的生命存在时,我们向this
添加属性。我们将var用于局部变量。
“我只对从对象内部访问变量感兴趣, 不是来自外面。“
对于此语句的回答是使用var
如果您只想在函数内部使用,因为var定义的变量只能在声明它们的作用域中的代码中访问,或者在词法嵌套作用域中使用。
所以Shomz建议你可以把它检查为:
var o = new MyObject();
a将是未定义的,因为它是使用var
o.a; // undefined
而b将在this
o.b; // 2
答案 1 :(得分:8)
如果将变量定义为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";
答案 2 :(得分:3)
这取决于你想要什么,使用函数内部的VAR不会使它在函数范围之外可访问,但从性能角度来看,如果你使用对象保留其中的所有内容,你已经将这个对象存储在记忆为什么要再次定义另一个变量。
如内存分析101 表单中所述的chrome devtools文档:
对象可以通过两种方式保存内存:直接由对象本身保存,并通过保持对其他对象的引用来隐式保存,从而防止它们被垃圾回收器(简称GC)自动处理。
对象本身持有的内存大小称为浅大小。典型的JavaScript对象为其描述和存储立即值保留了一些内存。
通常,只有数组和字符串才能具有明显的浅层大小。但是,字符串通常在渲染器内存中有其主存储器,在JavaScript堆上只暴露一个小的包装器对象。
然而,即使是一个小对象也可以通过防止其他对象被自动垃圾收集过程处理来间接地保存大量内存。删除对象本身时将释放的内存大小及其从GC根无法访问的依赖对象称为保留大小。
答案 3 :(得分:1)
如果要在实例化对象后使用属性,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