这些之间有什么区别?
var a = 13;
this.b = 21;
document.write(a);
document.write(b);
答案 0 :(得分:17)
对于全局代码(不属于任何函数的代码),它们几乎等效,最后都在全局对象上创建属性。
区别在于a
已使用var
语句声明,Variable Instantiation进程将使用全局对象作为变量对象 < sup>(1),它将该属性定义为不可删除,例如:
var a = 13;
delete a; // false
typeof a; // "number"
然后,b
因为全局代码中的this
值指向全局对象本身,所以也将是全局属性,但是可以删除这个:
this.b = 21;
delete b; // true
typeof b; // "undefined"
不要尝试Firebug中的第一个片段,因为Firebug的控制台在内部使用eval
运行代码,并且在此执行上下文中,变量实例化过程的行为有所不同,您可以尝试{{3 }} 子>
(1)变量对象(VO)是变量实例化过程使用的对象,用于定义FunctionDeclarations的标识符,使用var
语句声明的标识符和标识符函数形式参数,在不同的here中,所有这些标识符都被绑定为VO的属性,Scope链由VO列表组成。
对于全局代码,VO本身就是全局对象,这就是a
结束它作为属性的原因。对于功能代码,VO(也称为FunctionCode的<{3}} )是在调用函数时在幕后创建的新对象,这就是创建新词法的原因。范围,简而言之,我将谈论功能。
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;
这些差异可能微不足道,但我认为值得了解。
现在,如果您发布的代码段位于某个函数中,则完全不同。
在您的示例中使用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
使用execution contexts或Activation Object调用函数时,可以显式设置this
值:
function test() {
alert(this);
}
test.call("hello world!"); // alerts "hello world!"
答案 1 :(得分:1)
简而言之,如果你在函数中使用它们,那么 -
this.a; //will create a public property
var b; //will create a member variable
e.g。这是javascript中的Student类
var Student = function()
{
// Member variable
var studentId;
// Public property
this.Name = "";
}
了解更多信息 - 请参阅Object Oriented Programming with JavaScript