2012-10-21 59 views
0

一位面試官讓我解釋下面代碼中代表的是什麼。 我對此毫不知情。 因爲我以前沒見過這樣的代碼。 請告訴我這兩者之間有什麼區別,在什麼情況下這些代碼是有用的?這裏代表的這兩個是什麼?

function A(){ 
    this.x=1;//No.1 
    function B(){ 
     this.y=2;//No.2 
    } 
} 

我只知道當我用new來創建一個新的對象時,它有一個屬性x等於1;

+0

這取決於如何調用'A'和'B'。由於在運行時評估'this'的值,因此查看定義不提供任何信息。你可以在這裏找到所有的相關信息:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/this。 –

回答

4

這取決於你如何調用函數。如果你把它作爲一個經常性的功能,如:

A(); 

然後this將是文檔的window對象。

如果您使用的功能爲對象的構造函數,像這樣:

var a = new A(); 

然後this將是新創建的對象的引用。

B函數中的參考this永遠不會是任何東西,因爲無法調用該函數。它在A函數中是本地的,因爲A函數中沒有代碼可用於調用B函數,所以它將永遠不會被調用。

如果我們可以調用B函數,則同樣適用於A函數。什麼this取決於你如何使用該功能。即使您將A函數用作構造函數時(是A中的對象引用),A函數中的B函數也不會從A繼承this。它可以是對window(當B用作函數時)的引用,也可以是對新創建對象的引用(如果B用作構造函數)。

+0

非常感謝 – user1726273

2

如果在正常情況下使用這種情況,window上下文中,即使命名範圍不同,兩個this都會引用該窗口。

這裏是你發佈的代碼的調整版本:

function A(){ 
    this.x=1;//No.1 
    function B(){ 
     this.y=2;//No.2 
     console.log(this)  // log `this` 
    } 
    console.log(this)   // log `this` 
    B()      // Run function B() 
} 
A()       // Run function A() 

這將記錄在控制檯的各this。它返回

window 
window 

如果您在不同的上下文(如指定爲事件處理程序)調用A(),this //No.1將參考相關的對象。 this //No. 2仍然是window

+0

*「如果您從不同的上下文(例如事件偵聽器)調用A(),則該//No.1將引用相關對象。」*:僅當您將'A' **分配爲**事件處理程序,如果您從事件處理程序調用*,則不是。 –

+0

謝謝。我希望現在更清楚。 – ColBeseder

0

This.x和This.y指向窗口。但是你不能訪問函數B.它會顯示像B()這樣的錯誤是未定義的。見螢火蟲主機模式