2013-08-17 34 views
1

假設我們定義了一個簡單的一些儲值dd增加其輸入的功能:可以在javascript中引用一個函數本身嗎?

var obj={} 
obj.dd=1 
obj.f=function(x){ 
    return x+this.dd 
} 

或者你可以爲dd創建一個封閉如下但這將創建,而不是一個靜態增量可能被改變後來:

var dd=1 
var f=function(x){ 
    return x+dd 
} 

我們可以交替存儲dd在函數中:

var obj={} 
obj.f=function(x){ 
    return x+this.f.dd 
} 
obj.f.dd=1 

我很好奇,這是否是可能的函數來獲取連接到自身的變量,而不通過父對象去,有點像self關鍵字,將參考函數本身並允許如下:

var f=function(x){ 
    return x+self.dd 
} 
f.dd=1 

我知道沒有必要做這樣的事情,但我認爲這將是很酷,如果你可以。

+1

其他答案已經涵蓋了這在技術上是否可行。不過,我強烈建議保持簡單並使用常規功能來做同樣的事情(this/closures)。對大多數人來說,它不僅會更加熟悉,而且變異的函數屬性將會禁用許多編譯器優化。 – hugomg

回答

4

你可以給函數文本名稱:

var f = function me(x) { 
    return x + me.dd; 
}; 

f.dd = 1; 

這不正確的舊版本IE/JScript中的工作,不過,因爲mef不引用同一個對象。的(不建議使用,並在嚴格模式下不可用)的選擇是arguments.callee

var f = function(x) { 
    return x + arguments.callee.dd; 
}; 

f.dd = 1; 

而且,你對封值得注意的是不完全正確;它可以稍後改變,即使通過另一個功能:

var dd = 1; 
var f = function(x) { 
    return x + dd; 
}; 

var setdd = function(_dd) { 
    dd = _dd; 
}; 
+0

感謝您的回覆。所以我認爲沒有辦法創建一個表現出這種行爲的匿名函數? – gloo

+0

我對stackover禮儀有疑問。我現在意識到,摸索了我的問題,我想問一下,在匿名函數中是否有這樣的行爲是可能的。我應該發佈一個新問題還是編輯現有問題? – gloo

+0

@gloo:你可以編輯你的問題。無論如何,是的,你可以使用'arguments.callee';但「匿名函數」的意義何在?您可以在任何可以使用匿名函數文字的地方使用命名函數。 *唯一*警告是IE 8,'argument.callee'從IE3或其他版本開始工作,所以不用擔心。 – Ryan

2

函數是一個對象。如果您參考var持功能:

var f = function (x) { 
    return x + f.dd 
}; 

f.dd = 1; 

alert(f(1)); 

結果:2

如果該功能被命名,你可以這樣做:

function foo(x) { 
    return x + foo.dd; 
} 

foo.dd = 1; 
alert(foo(1)); 

結果:2

相關問題