这些有什么区别?
var a = 13;
this.b = 21;
document.write(a);
document.write(b);
最佳答案
对于全局代码(不属于任何函数的代码),它们几乎是等价的,都在最后创建全局对象的属性。
区别在于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 中尝试第一个片段,因为 Firebug 的控制台在内部使用 eval
运行代码,并且在此执行上下文中变量实例化过程的行为不同,您可以尝试here .
(1) 变量对象 (VO) 是变量实例化过程用来定义 FunctionDeclarations 标识符的对象,标识符是用 var
语句声明的, 和函数形式参数的标识符,在不同的 execution contexts ,所有这些标识符都绑定(bind)为 VO 的属性,作用域链由 VO 的列表组成。
对于全局代码,VO 是全局对象本身,这就是为什么 a
最终成为它的一个属性。对于函数代码,VO(也称为 FunctionCode 的 Activation Object)是调用函数时在幕后创建的新对象,这就是创建新词法作用域的原因,简而言之,我将讨论功能。
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;
这些差异可能微不足道,但我认为值得了解。
现在,如果您发布的代码片段在一个函数内,则完全不同。
在您的示例中使用 var
语句声明的 a
标识符将是一个局部变量,仅可用于函数(以及任何嵌套函数)。
请记住,在 JavaScript block 中不会引入新范围,只有函数会引入新范围,并且要在该范围内声明变量,您应该始终使用 var
.
this.b
标识符将成为绑定(bind)到由 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
调用函数时,可以显式设置this
值或apply
:function test() { alert(this); } test.call("hello world!"); // alerts "hello world!"
关于javascript - 在 Javascript 中使用 var 和 this 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3116109/