7

这些有什么区别?

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

2 回答 2

19

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

不同之处在于a,已经用var语句声明,变量实例化过程将使用全局对象作为变量对象 (1),并将该属性定义为不可删除,例如:

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

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

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

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

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

对于全局代码,VO 是全局对象本身,这就是为什么aend 是它的属性。对于函数代码,VO(也称为函数代码的激活对象)是在调用函数时在幕后创建的一个新对象,这就是创建新词法范围的原因,总之我会谈论函数.

两者athis.b都可以简单地解析为 by 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. 当您使用orthis调用函数时,可以显式设置该值:callapply

    function test() {
      alert(this);
    }
    test.call("hello world!"); // alerts "hello world!"
    
于 2010-06-25T07:04:23.707 回答
1

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

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 = "";
}

更多信息 - 请参阅使用 JavaScript 进行面向对象编程

于 2010-06-25T07:00:53.230 回答