在Javascript中使用var和this有什么区别?

前端之家收集整理的这篇文章主要介绍了在Javascript中使用var和this有什么区别?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这些有什么区别?
var a = 13;  
this.b = 21;  
document.write(a);  
document.write(b);

解决方法

对于全局代码(不属于任何函数代码),它们几乎是等效的,最后都在全局对象上创建属性.

不同之处在于,已经使用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

>使用callapply调用函数时,可以显式设置此值:

function test() {
  alert(this);
}
test.call("hello world!"); // alerts "hello world!"

猜你在找的JavaScript相关文章