这两者之间有什么区别?
var a = 13;
this.b = 21;
document.write(a);
document.write(b);
var a = 13;
this.b = 21;
document.write(a);
document.write(b);
对于全局代码(不属于任何函数的代码),它们在最后都会创建一个全局对象上的属性,几乎是等效的。
区别在于使用 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(也称为函数代码的活动对象),在调用函数时在后台创建一个新对象,这就创建了一个新的词法作用域,简而言之,我将谈论函数。
由于作用域链中的第一个对象仍然是全局对象,因此a
和this.b
都可以像a
和b
一样简单地解析。
另外,我认为值得知道的是变量实例化过程发生在代码执行之前,例如:
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
将是一个本地变量,仅在函数的词法作用域(以及任何嵌套函数)中可用。var
。
this.b
标识符将成为绑定到由 this
值引用的对象的属性,但是... 什么是this
???
在JavaScript中,当您调用函数时,this
值会隐式设置,并且它是由您如何调用函数确定的: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
function test() {
alert(this);
}
test.call("hello world!"); // alerts "hello world!"
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面向对象编程
var
声明变量创建全局对象的属性是全局对象被用作变量对象的一个副作用。 - Tim Down