2013-06-26 13 views
0

的我想用「來電顯示」的屬性,其定義的函數風格here呼叫者屬性爲「foo =功能()」編碼

它正常工作,這種風格函數聲明

function g() { 
     alert(g.caller.name) // f 
} 

    function f() { 
     alert(f.caller.name) // undefined 
     g() 
} 

f() 

JSfiddle for this

但後來我的函數的聲明是一樣的東西

g = function() { 
     alert(g.caller.name) // expected f, getting undefined 
    } 


    f = function() { 
    alert("calling f") 
    alert(f.caller.name) // undefined 
    g() 
    } 

f() 

,我越來越不確定的(基本上沒有得到任何東西)

JSfiddle for this

有沒有我可以使用呼叫者屬性而無需重寫我的代碼什麼辦法?另外,我希望我在使用和函數聲明方面沒有犯任何錯誤,因爲我對使用JS很陌生。

+0

請參閱[JavaScript:var functionName = function(){} vs function functionName(){}](http://stackoverflow.com/questions/336859/javascript-var-functionname-function-vs-function-functionname)和[函數'名稱'文檔](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name) – Bergi

回答

1

此功能...

f = function() { 
    g(); 
}; 

...沒有一個名字。這是一個匿名函數,分配給標識爲f的變量。如果你做的是功能的命名的函數表達式這將工作是:

f = function f() { 
    g(); 
}; 

注意,由於匿名函數從全局執行上下文調用,這是caller屬性null(注意在的jsfiddle,它將不會是null,它將是JSFiddle調用您的代碼的任何函數)。

您已經演示了函數聲明和函數表達式之間的區別之一。你的第一個例子顯示函數聲明。他們必須有一個標識符。你的第二個例子使用函數表達式標識符是可選的,僅在函數本身的範圍內。