var a = 13; this.b = 21; document.write(a); document.write(b);
解决方法@H_502_6@
对于全局代码(不属于任何函数的代码),它们几乎是等效的,最后都在全局对象上创建属性.
不同之处在于,已经使用var语句声明的a,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中,所有这些标识符都是作为VO的属性绑定,Scope链由VO列表组成.
对于全局代码,VO本身就是全局对象,这就是为什么结尾是它的属性.对于功能代码,VO(也称为FunctionCode的Activation Object)是在调用函数时在幕后创建的新对象,这就是创建新词法范围的原因,简而言之我将讨论函数.
a和this.b都可以简单地用作a和b的resolved,因为作用域链中的第一个对象又是全局对象.
此外,我认为工作知道变量实例化过程发生在代码执行之前,例如:
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语句声明的标识符将是一个局部变量,仅可用于函数的词法范围(以及任何嵌套函数).
请记住,在JavaScript块中没有引入新的作用域,只有函数可以做,并且要在该作用域中声明变量,您应该始终使用var.
this.b标识符将成为绑定到此值引用的对象的属性,但是……这是什么???.
当您调用函数时,JavaScript中的这个值是隐式设置的,它取决于您如何调用它:
>当您使用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
function test() {
return this == window;
}
test(); // true
function test() {
alert(this);
}
test.call("hello world!"); // alerts "hello world!"
不同之处在于,已经使用var语句声明的a,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中,所有这些标识符都是作为VO的属性绑定,Scope链由VO列表组成.
对于全局代码,VO本身就是全局对象,这就是为什么结尾是它的属性.对于功能代码,VO(也称为FunctionCode的Activation Object)是在调用函数时在幕后创建的新对象,这就是创建新词法范围的原因,简而言之我将讨论函数.
a和this.b都可以简单地用作a和b的resolved,因为作用域链中的第一个对象又是全局对象.
此外,我认为工作知道变量实例化过程发生在代码执行之前,例如:
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语句声明的标识符将是一个局部变量,仅可用于函数的词法范围(以及任何嵌套函数).
请记住,在JavaScript块中没有引入新的作用域,只有函数可以做,并且要在该作用域中声明变量,您应该始终使用var.
this.b标识符将成为绑定到此值引用的对象的属性,但是……这是什么???.
当您调用函数时,JavaScript中的这个值是隐式设置的,它取决于您如何调用它:
>当您使用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
function test() { return this == window; } test(); // true
function test() { alert(this); } test.call("hello world!"); // alerts "hello world!"