簡體   English   中英

在Javascript中使用var和this有什么區別?

[英]What is the difference between using var and this, in Javascript?

這些有什么區別?

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目的是它的特性。 對於功能代碼,VO( 也稱為FunctionCode的激活對象 )是在調用函數時在幕后創建的新對象,這就是創建新詞法范圍的原因,簡而言之,我將討論函數。

athis.b都可以簡單地通過ab解析 ,因為作用域鏈中的第一個對象又是全局對象。

此外,我認為工作知道變量實例化過程發生代碼執行之前 ,例如:

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塊中不引入新范圍,只有函數可以執行,並且要在該范圍內聲明變量,應始終使用var

this.b標識符將成為綁定到由該被稱為所述對象的屬性this值,但是... 什么是this ???

調用函數時,JavaScript中的this值是隱式設置的,它取決於你如何調用它:

  1. 當您使用new運算符時,函數內的this值將指向新創建的對象,例如:

     function Test() { this.foo = "bar"; } var obj = new Test(); // a new object with a `foo` property 
  2. 當您調用作為對象成員的函數時,該函數內的this值將指向基礎對象 ,例如:

     var obj = { foo: function () { return this == obj; } }; obj.foo(); // true 
  3. 當您調用沒有任何基礎對象的函數時, this值將引用全局對象:

     function test() { return this == window; } test(); // true 
  4. 當您使用callapply調用函數時,可以顯式設置this值:

     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進行面向對象編程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM