javascript变量与此
如果我的代码是这样的,那么使用var和this的首选方法是什么javascript变量与此,javascript,variables,Javascript,Variables,如果我的代码是这样的,那么使用var和this的首选方法是什么 function MyObject() { var self = this; var a = 1; this.b = 2; var innerMethod = function() { logMessage(a); logMessage(self.b); } } 据我所知,只要MyObject存在,var就会存在,所以这和使用它不一样吗 编辑: 为了
function MyObject() {
var self = this;
var a = 1;
this.b = 2;
var innerMethod = function() {
logMessage(a);
logMessage(self.b);
}
}
据我所知,只要MyObject存在,var就会存在,所以这和使用它不一样吗
编辑:
为了进一步澄清这个问题,我只对从对象内部访问变量感兴趣,而不是从外部访问变量。使用
var a
您无法访问范围之外的变量,但是使用赋值时,在创建对象时可以访问该
当我们希望属性随对象的生命周期而存在时,我们将属性添加到中。我们使用var作为局部变量
“我只对从对象内部访问变量感兴趣,
不是从外面来的。”
如果只想在函数内部使用,而不想在函数外部使用,则此语句的答案是usevar
,因为使用var定义的变量只能在声明变量的范围内或在词汇嵌套的范围内访问
因此,正如Shomz所建议的,您可以通过以下方式进行检查:
var o = new MyObject();
a将被取消定义,因为它是用var
o.a; // undefined
而b将返回2,因为它在此
o.b; // 2
如果要在实例化对象后使用属性,var
将不起作用,请参见以下内容:
函数MyObject(){
var self=这个;
var a=1;
这是b=2;
var innerMethod=函数(){
日志信息(a);
日志信息(self.b);
}
}
var o=新的MyObject();
控制台日志(o.a);//未定义
控制台日志(o.b);//2
如果将变量定义为var
,则其范围仅限于函数(从外部看不到)。用面向对象的术语来说,它有点像私有财产,实际上根本不是财产
如果将变量定义为属性(this.name
),则可以从外部访问该变量
函数也是如此。在函数范围内声明但未分配给属性的函数只能从内部看到。如果将函数指定给属性,则可以从外部访问该函数(只要属性始终指向该函数)
这取决于您想要什么,在函数内使用VAR将不会使其在函数范围外可访问,但从性能角度来看,如果您使用的对象将所有内容都保留在函数范围内,那么您已经将此对象存储在内存中,为什么要再次定义另一个变量
如内存分析101表单chrome开发工具文档中所述:
一个对象可以通过两种方式持有内存:直接由对象本身持有,隐式地持有对其他对象的引用,从而防止它们被垃圾收集器(简称GC)自动处置
对象本身拥有的内存大小称为浅内存大小。典型的JavaScript对象为其描述和存储即时值保留了一些内存
通常,只有数组和字符串可以具有显著的浅层大小。但是,字符串的主存储通常在渲染器内存中,在JavaScript堆上只公开一个小的包装器对象
尽管如此,通过防止自动垃圾收集进程处理其他对象,即使是小对象也可以间接地保存大量内存。当对象本身被删除,并且其依赖对象无法从GC根访问时,将释放的内存大小称为保留大小
您可能需要检查:检查链接以更清楚地理解这一点。我理解这一点,请阅读我的编辑。在这种情况下,您可以只使用var
。这可能是最好的答案。因此,使用此选项可以更好地提高性能?除了前缀self的代码看起来很混乱之外,我对此没有任何问题。这和在任何地方使用var是一样的,我大部分时间都使用前缀“vars”,所以当我看到var时,它是一个新变量,当我看到vars时,它是一个使用这个的变量。所以这取决于你,你可以把它弄得乱七八糟或者好看。你为什么要这样做?this.saleepolitely=saleepolitely;我认为它至少有三个(可能是主观的)优点,而不是直接使用this.salletpolitely=function(){}@Toniq。(1) 即使属性的值从外部更改,也可以从构造函数的作用域访问命名函数。(2) 构造函数中的代码比较干净,因为您没有到处都是this
或self
。(3) 构造函数中的代码更干净,因为可以直观地将函数的实现与函数是否为公共分开。首先定义所有函数,然后只将公共函数分配给属性,这样一眼就能看出哪些是公共的,哪些不是。通常函数的作用域是什么?@ssal函数的作用域通常()
仅限于在Person
中声明的函数。Person()
中的所有代码通常可以看到salelecaly()
。请注意,每次调用Person()
时,都会创建函数saleeCasually()
的新“实例”。
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";