javascript变量与此

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就会存在,所以这和使用它不一样吗 编辑: 为了

如果我的代码是这样的,那么使用var和this的首选方法是什么

function MyObject() {
    var self = this;

    var a = 1;
    this.b = 2;

    var innerMethod = function() {

        logMessage(a); 
        logMessage(self.b); 
    }
}
据我所知,只要MyObject存在,var就会存在,所以这和使用它不一样吗

编辑:


为了进一步澄清这个问题,我只对从对象内部访问变量感兴趣,而不是从外部访问变量。

使用
var a
您无法访问范围之外的变量,但是使用
赋值时,在创建对象时可以访问该

当我们希望属性随对象的生命周期而存在时,我们将属性添加到
中。我们使用var作为局部变量

“我只对从对象内部访问变量感兴趣, 不是从外面来的。”

如果只想在函数内部使用,而不想在函数外部使用,则此语句的答案是use
var
,因为使用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) 构造函数中的代码比较干净,因为您没有到处都是thisself。(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";