2012-07-01 83 views
0
function MyArray() { 
    var self = this.arguments; //<--- 
    this.toString = function() { 
     return self; 
    }; 

} 

var c = new MyArray(2, 3, 1, '232'); 
console.log(c.toString()); 

未定義爲什麼我不能使用this.arguments,而參數工作?

function MyArray() { 
    var self = arguments; //<--- 
    this.toString = function() { 
     return self; 
    }; 

} 

var c = new MyArray(2, 3, 1, '232'); 
console.log(c.toString()); 

[2,3,1, '232']

那麼,爲什麼會這樣? this.arguments論據有什麼區別?

+0

您必須在不同範圍內定義參數,所以如果您也顯示該參數可能會有所幫助。 –

+0

您是否假設JavaScript中的this代表它以不同語言表示的東西? – 2012-07-01 20:05:33

+0

請首先解釋爲什麼它應該起作用,因爲'this.arguments'和'arguments'在任何情況下都不等於我 – Esailija

回答

1

在JS,this表示「呼叫上下文」,其可被設定的多種不同的方式。它與變量範圍無關。他們完全是分離的概念。這就是爲什麼arguments可用作變量,但不是this的屬性。

this的值根據函數是如何被調用。


作爲調用的方法

例如,如果我這樣做......

my_obj.myMethod(); 

...然後this將參考my_obj因爲函數myMethod被稱爲從my_obj的上下文。


獨立作爲函數調用

,但如果我這樣做......

var m = my_obj.myMethod; 
m(); 

即使my_objmyMethod是相同的代碼作爲第一個例子,值通常會更改爲global對象。


使用.call.apply

還有其他幾種方法this可以設置以及調用。

m.call(my_other_obj, "more", "args"); 

m.apply(my_other_obj, ["more", "args"]); 

使用.call.apply,通過了第一個參數成爲this值。兩者的區別在於其他參數是如何傳遞的。


使用.bind

還有.bind()這需要參數以相同的方式爲.call(),而是創建並返回與this值和任何其他參數固定設置一個新的函數創建。


使用new操作

最後一種方法調用是,當你調用一個函數作爲構造。爲此,請使用new運算符。

var new_obj = new m; 

var new_obj = new obj.m; 

在這兩種情況下,this值將是被構造一個新的對象。 YOu不應該使用new,除非被調用的函數已被設置爲用作構造函數。

相關問題