在Javascript中使用var和this有什么区别?

时间:2010-06-25 06:53:17

标签: javascript variable-declaration

这些之间有什么区别?

var a = 13;  
this.b = 21;  
document.write(a);  
document.write(b);

2 个答案:

答案 0 :(得分:17)

对于全局代码(不属于任何函数的代码),它们几乎等效,最后都在全局对象上创建属性。

区别在于a已使用var语句声明,Variable Instantiation进程将使用全局对象作为变量对象 < sup>(1),它将该属性定义为不可删除,例如:

var a = 13;
delete a; // false
typeof a; // "number"

然后,b因为全局代码中的this值指向全局对象本身,所以也将是全局属性,但是可以删除这个:

this.b = 21;
delete b; // true
typeof b; // "undefined"

不要尝试Firebug中的第一个片段,因为Firebug的控制台在内部使用eval运行代码,并且在此执行上下文中,变量实例化过程的行为有所不同,您可以尝试{{3 }}

(1)变量对象(VO)是变量实例化过程使用的对象,用于定义FunctionDeclarations的标识符,使用var语句声明的标识符和标识符函数形式参数,在不同的here中,所有这些标识符都被绑定为VO的属性,Scope链由VO列表组成。

对于全局代码,VO本身就是全局对象,这就是a结束它作为属性的原因。对于功能代码,VO(也称为FunctionCode的<{3}} )是在调用函数时在幕后创建的新对象,这就是创建新词法的原因。范围,简而言之,我将谈论功能。

athis.b只能ab,因为范围链中的第一个对象又是全局对象

另外,我认为工作知道变量实例化过程在之前发生而不是代码执行,例如:

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 ???

当您调用函数时,会隐式设置JavaScript中的this值,这取决于您如何调用它:

  1. 当您使用new运算符时,函数内的this值将指向新创建的对象,例如:

    function Test() {
      this.foo = "bar";
    }
    var obj = new Test(); // a new object with a `foo` property
    
  2. 当您调用对象的成员的函数时,该函数内的this值将指向基础对象,例如:

    var obj = {
      foo: function () {
        return this == obj;
      }
    };
    obj.foo(); // true
    
  3. 当您调用不带任何基础对象的函数时,this值将引用全局对象:

    function test() {
      return this == window;
    }
    test(); // true
    
  4. 使用execution contextsActivation Object调用函数时,可以显式设置this值:

    function test() {
      alert(this);
    }
    test.call("hello world!"); // alerts "hello world!"
    

答案 1 :(得分:1)

简而言之,如果你在函数中使用它们,那么 -

this.a; //will create a public property

var b; //will create a member variable

e.g。这是javascript中的Student类

var Student = function()
{
    // Member variable
    var studentId;

    // Public property
    this.Name = "";
}

了解更多信息 - 请参阅Object Oriented Programming with JavaScript