【发布时间】:2010-06-25 06:53:17
【问题描述】:
这些有什么区别?
var a = 13;
this.b = 21;
document.write(a);
document.write(b);
【问题讨论】:
标签: javascript variable-declaration
这些有什么区别?
var a = 13;
this.b = 21;
document.write(a);
document.write(b);
【问题讨论】:
标签: javascript variable-declaration
对于全局代码(不属于任何函数的代码),它们几乎等效,最后都在全局对象上创建一个属性。
不同的是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)是在调用函数时在后台创建的新对象,这就是创建新词法范围的原因,简而言之,我会谈谈函数。
a 和 this.b 都可以是 resolved,就像 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;
这些差异可能微不足道,但我认为值得了解。
现在,如果您发布的代码 sn-p 在一个函数中,它完全不同。
a 标识符,在您的示例中使用 var 语句声明将是一个局部变量,仅可用于函数的词法范围(以及任何嵌套函数)。
请记住,在 JavaScript 块中不会引入新范围,只有函数会这样做,并且要在该范围内声明变量,您应该始终使用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
当您使用call 或apply 调用函数时,可以显式设置this 值:
function test() {
alert(this);
}
test.call("hello world!"); // alerts "hello world!"
【讨论】:
var 声明变量会创建全局对象的属性,这是全局对象用作全局范围内的变量对象这一事实的副作用。
简而言之,如果你在函数中使用这些,那么 -
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 = "";
}
【讨论】: