【问题标题】:What is the difference between using var and this, in Javascript?在 Javascript 中使用 var 和 this 有什么区别?
【发布时间】:2010-06-25 06:53:17
【问题描述】:

这些有什么区别?

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

【问题讨论】:

    标签: javascript variable-declaration


    【解决方案1】:

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

    不同的是a,已经用var语句声明,Variable Instantiation进程会使用全局对象作为变量对象 (1),它会将该属性定义为不可删除,例如:

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

    那么,b由于全局代码中的this值,指向全局对象本身,也会是一个全局属性,不过这个可以删除:

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

    不要在 Firebug 中尝试第一个 sn-p,因为 Firebug 的控制台在内部使用 eval 运行代码,并且在此执行上下文中变量实例化过程的行为不同,您可以尝试一下 here .

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

    对于全局代码,VO 是全局对象本身,这就是为什么a 最终成为它的属性。对于函数代码,VO(也称为Activation Object for FunctionCode)是在调用函数时在后台创建的新对象,这就是创建新词法范围的原因,简而言之,我会谈谈函数。

    athis.b 都可以是 resolved,就像 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;
    

    这些差异可能微不足道,但我认为值得了解。

    现在,如果您发布的代码 sn-p 在一个函数中,它完全不同

    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. 当您使用callapply 调用函数时,可以显式设置this 值:

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

    【讨论】:

    • +1 只是为了这个清晰的解释,我检查了你的个人资料,看看你是否有一个我可以阅读的博客:)
    • +1 进行了很好的解释,但是您的第一行有些不准确:全局变量与全局对象的属性不同,正如您接下来要说明的那样。在全局范围内用var 声明变量会创建全局对象的属性,这是全局对象用作全局范围内的变量对象这一事实的副作用
    【解决方案2】:

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

    this.a; //will create a public property
    
    var b; //will create a member variable
    

    例如这是 javascript 中的 Student 类

    var Student = function()
    {
        // Member variable
        var studentId;
    
        // Public property
        this.Name = "";
    }
    

    更多信息 - 见Object Oriented Programming with JavaScript

    【讨论】:

      猜你喜欢
      • 2013-05-26
      • 2019-09-21
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 2011-04-12
      • 1970-01-01
      相关资源
      最近更新 更多