这些有什么区别?
var a = 13;
this.b = 21;
document.write(a);
document.write(b);
这些有什么区别?
var a = 13;
this.b = 21;
document.write(a);
document.write(b);
对于全局代码(不属于任何函数的代码),它们几乎是等价的,最后都在全局对象上创建了一个属性。
不同之处在于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 是全局对象本身,这就是为什么a
end 是它的属性。对于函数代码,VO(也称为函数代码的激活对象)是在调用函数时在幕后创建的一个新对象,这就是创建新词法范围的原因,总之我会谈论函数.
两者a
和this.b
都可以简单地解析为 by 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;
这些差异可能微不足道,但我认为值得了解它们。
现在,如果您发布的代码片段在函数内,则完全不同。
在您的示例中使用语句声明的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
当您使用orthis
调用函数时,可以显式设置该值:call
apply
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 中的 Student 类
var Student = function()
{
// Member variable
var studentId;
// Public property
this.Name = "";
}
更多信息 - 请参阅使用 JavaScript 进行面向对象编程