2012-03-06 83 views
0

的內在屬性訪問是什麼爲什麼我必須使用「本」在函數的

function person(first_name, last_name) { 
    this.first = first_name 
    this.last = last_name 
} 

,這之間的區別:

function person(first_name, last_name) { 
    var first = first_name 
    var last = last_name 
} 

爲什麼只有第一個讓person.first & person.last以外的功能?

+0

因爲在函數的第二個版本中,變量在函數中的作用域和行爲類似於C#/ Java/PHP中的私有聲明等。 – Chandu 2012-03-06 13:02:42

+0

因爲函數中的var將設置局部變量 – androidavid 2012-03-06 13:03:51

+0

https ://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects – nnnnnn 2012-03-06 13:04:25

回答

2

一個函數中的this關鍵字被稱爲調用上下文

1)如果你定義函數作爲一個對象的一個​​成員(方法):

myObject.someMethod = function() { this.x = 2; }; 

然後調用上下文,this,是在其中添加,myObject方法的對象。所以在上面調用myObject.someMethod();之後,myObject.x就是2.成員x在您調用方法之前是未定義的,除非您之前已經定義了它。

2)如果您使用的功能與new關鍵字構造函數,然後this指的是正在創建新的對象:

function MyX() { this.x = 3; }; 
var myX = new MyX(); 

然後您就擁有財產myX.x設置爲3

請注意,我打電話給我的構造函數MyX()而不是myX()。你應該打電話給你Person(),而不是person()。這只是一個約定,但是指出一個函數是用作構造函數是有用的。

3)最後,如果你,你呼叫作爲既不是方法,也不是一個構造函數內使用this,然後this全局對象document或,等價地,window)。但請注意,如果您在strict模式下使用javascript(您應該這樣做),則this在這種情況下未定義,這意味着您基本上不能在不是方法或構造函數的函數中使用this


您的具體問題涉及情況2),構造函數。構造函數中的this.x = 3只是設置新創建對象的屬性x。創建某個對象myX後,可以使用myX.x作爲任何其他對象屬性在外部訪問和修改x

1

'var'關鍵字使變量有作用域。在最後一個例子中,var first和var last創建的變量只能在函數的作用域中訪問。你可以在構造函數中看到這是一個局部變量。

2

當你寫(使用new)構造函數 - 你使用添加this.XXX

性能,那麼你做的事:

var p = new Person('s','d'); 

,然後你必須在第二個獲得p.first

例如: youre沒有創建任何屬性..

你只能創建私有變量。

,所以你不能訪問他們...

1

當你的JavaScript變量聲明爲

var variable 

它只有在你宣佈它的方法內部存在。如果你希望每個人都可以訪問變量(即全局變量),那麼必須聲明變量不帶'var'部分

0

你不一定必須使用this。它還會正常工作,如果你有一個結構是這樣的:

Person = function(first_name, last_name) { 
    var first, last; 
    create(first_name, last_name);  

    function create(first_name, last_name) { 
     first = first_name 
     last = last_name 
    } 

    return { 
     firstName: first, 
     lastName: last 
    } 
} 
+0

鑑於使用'this'與'new person()'一起工作,這並不是真正的可比性。設置全局變量不會讓你有多個「實例」。 – nnnnnn 2012-03-06 13:07:20

+0

哦,對不起。我基本上是在談論模塊模式。現在編輯它,使其更清晰。 – Harti 2012-03-06 14:03:17

相關問題