2012-02-01 73 views
1

由於函數是第一類對象,所以應該可以分配給它們的成員。如何分配給一個函數的成員?

我是不是認爲arguments.callee這樣做?

是否有其他方法來設置這些字段?

如何在第一種情況下設置field

function something1() { 
    arguments.callee.field = 12; 
} 

alert(something1.field); // will show undefined 
something1(); 
alert(something1.filed); // will show 12 

something2 = function() { 
    arguments.callee.field = 12; 
}; 

alert(something2.field); // will show undefined 
something2(); 
alert(something2.field); // will show 12 

更新1

我的意思是如何從函數內訪問的成員在運行時。

回答

1

你並不需要使用arguments.callee指具有名稱的功能;你可以使用這個名字。當你使用

function name(...) { ... } 

語法聲明函數時,情況自然就是這樣;但即使在一個函數表達式,你被允許提供一個臨時名稱:

(function temp_name(...) { ... })(arg); 

所以,如果你想從設置裏面的函數的屬性,你可以寫:

function something1() { 
    something1.field = 12; 
} 

alert(something1.field); // will show undefined 
something1(); 
alert(something1.field); // will show 12 

something2 = function something2() { // note the second "something2" 
    something2.field = 12; 
}; 

alert(something2.field); // will show undefined 
something2(); 
alert(something2.field); // will show 12 
+0

我可以寫'something2 =函數something3(){...};'兩個名字之間有什麼區別? – Dims 2012-02-01 20:46:37

+1

@Dims:是的,你可以。區別在於名稱'something3'是該函數的本地名稱,而名稱'something2'將具有您期望的任何外部範圍。所以,例如,你可以寫'var f = function g(){alert(g); };警報(F); f();' - 在函數中使用'g',之後使用'f'。 – ruakh 2012-02-01 21:12:08

0

簡單

function something1() {}; 
something1.Property = "Foo"; 

可以直接給屬性的任何功能就像一個正常的對象。如果說在OOP語言中創建靜態屬性和方法。

編輯

功能

function something1() { 
    something1.AnotherProp = "Bar"; 
}; 
something1.Property = "Foo"; 
+0

我的意思是從函數內部。 – Dims 2012-02-01 20:39:27

1

這是我會怎麼做這裏面的一樣:

function something1() { 
    this.field = 12; 
} 

var test = new something1(); 

alert(test.field); // alerts "12" 
test.field = 42; 
alert(test.field); // alerts "42" 

如果你打算把它當作一個類,需要創建它的新實例,然後才能訪問其字段。

JSFiddle

+0

謝謝,但這件事我已經知道了。 – Dims 2012-02-01 20:41:20

1

我是否認爲arguments.callee這樣做?

是的,但現在他們deprecated它。

是否有其他方法來設置這些字段?

替換callee的官方方法是使用明確的函數名稱,如funcName.propertyName=...。然而,這並不總是很方便,例如,動態生成的函數。引用John Resig,we're going to miss arguments.callee,它對於特定任務非常有用。

相關問題