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

7
这两者之间有什么区别?
var a = 13;  
this.b = 21;  
document.write(a);  
document.write(b);
2个回答

19

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

区别在于使用 var 声明的变量 a,在变量实例化过程中将使用全局对象作为变量对象(1),并且它将在该对象上将该属性定义为不可删除,例如:

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

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

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

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

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

对于全局代码,VO就是全局对象本身,这就是为什么a最终会成为它的属性。对于函数代码,VO(也称为函数代码的活动对象),在调用函数时在后台创建一个新对象,这就创建了一个新的词法作用域,简而言之,我将谈论函数。

由于作用域链中的第一个对象仍然是全局对象,因此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;
这些差异可能微不足道,但我认为了解它们还是值得的。
现在,如果您发布的代码片段位于函数内部,则情况会完全不同。
在您的示例中使用 var 语句声明的标识符 a 将是一个本地变量,仅在函数的词法作用域(以及任何嵌套函数)中可用。
请记住,在JavaScript中,块不会引入新的作用域,只有函数才会,并且要在该作用域中声明变量,您应始终使用varthis.b 标识符将成为绑定到由 this 值引用的对象的属性,但是... 什么是this??? 在JavaScript中,当您调用函数时,this值会隐式设置,并且它是由您如何调用函数确定的:
1. 当您使用 new 运算符时,函数内部的 this 值将指向一个新创建的对象,例如:
function Test() {
  this.foo = "bar";
}
var obj = new Test(); // a new object with a `foo` property
当您调用一个属于对象的成员函数时,该函数内部的this值将指向基本对象,例如:

var obj = {
  foo: function () {
    return this == obj;
  }
};
obj.foo(); // true
当你调用一个没有基对象的函数时,this 值将指向全局对象:
function test() {
  return this == window;
}
test(); // true
  • 使用 callapply 调用函数时,可以显式地设置 this 值:

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

    因为你的解释非常清晰,我查看了你的个人资料,看看是否有我可以阅读的博客 :) - Konerak
    +1 对于好的解释,但你的第一行有些不准确:全局变量并不等同于全局对象的属性,正如你接下来所展示的。在全局作用域中使用 var 声明变量创建全局对象的属性是全局对象被用作变量对象的一个副作用。 - Tim Down

    1
    简单来说,如果你在一个函数中使用这些内容 -
    this.a; //will create a public property
    
    var b; //will create a member variable
    

    例如,这里有一个JavaScript中的学生类

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

    更多信息 - 请查看JavaScript面向对象编程


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接