2013-09-27 55 views
-3

定義javascript函數有多種不同的方法。我經常用最簡單的方法來定義函數如何使用javascript函數? (定義標籤中的函數)

function myfunc(){ 
} 

,並在這樣的變量定義函數的下一個方式(有點混亂使用的方式)

var myvar = myfunc(){ 
/*some code*/ 
} 

和困難方法對我來說,大多在代碼中發現開發高級程序員像下面

var SqueezeBox={presets:{onOpen:function(){},onClose:function(){}} 

請,任何人都可以清楚我對這個概念,我如何使用?

+5

第二個例子是無效的,我想你想寫'VAR MYVAR =函數(){} [VAR functionName =函數(){} VS功能使用functionName(){}'的可能 –

+1

重複](http://stackoverflow.com/questions/336859/var-functionname-function-vs-function-functionname) – CodingIntrigue

+0

最後一個是匿名函數,作者如何調用函數或爲該函數設置一些代碼。 –

回答

0

var SqueezeBox={presets:{onOpen:function(){},onClose:function(){}}} 

他創建包含另一個對象presets對象SqueezeBox有兩個空的匿名函數,他的定義與{}內的空體函數內聯。 一個更好的辦法,看看它的格式是這樣的:

var SqueezeBox={ 
        presets:{ 
          onOpen:function(){/* empty function body */}, 
          onClose:function(){/*empty function body */} 
          } 
        } 
1

第一代碼片段是函數聲明

function myfunc() { } 

您聲明名爲function稱爲myfunc。您可以通過myfunc.name === "myfunc"

驗證您的第二個代碼段包含語法錯誤。我相信你的意思是:

var myvar = function() { }; 

這是分配給可變匿名函數表達式。您可以通過typeof myvar === "function"myvar.name === ""進行驗證。

第三個片段是一個javascript對象。基本上你可以認爲它是MapDictionary<string, object>。所以SqueezeBox包含1個密鑰presets,這又是一個包含2個密鑰的字典,onOpenonClose,它們都是匿名函數

3
function myfunc(){} 

函數聲明:該功能是使用標準語法

function functionName(params[]) { 
    //functionbody 
} 

使用這種語法聲明聲明在開始執行範圍的功能,所以他們會在提供無處不在的範圍(以及它們的下級範圍)。

var s = myfunc(); //s == 0 
function myfunc() {return 0;} 

var myfunc = function() {}; 

這使用稱爲函數表達式圖案,它只是分配的匿名函數到名爲myfunc變量的引用。使用此語法將不允許您在解析變量之前使用該函數。即使變量在其範圍的頂部懸掛,在翻譯時分析它們他們正在初始化,所以上面的例子則不行:

var s = myfunc(); //ReferenceError: myfunc is not defined 
var myfunc = function() {return 0;}; 

但低於意願例如:

var myfunc = function() {return 0;}; 
var s = myfunc(); //s == 0 

第三個例子只是以我們剛剛完成函數表達式的方式爲對象屬性(也稱爲對象方法)分配一個匿名函數,因此如果使用上述模式,代碼將變爲:

var onOpen = function() {}, 
    onClose = function() {}, 
    SqueezeBox = {//curly braces denotes an object literal 
     presets: {//again, this is a nested object literal 
      onOpen: onOpen, 
      onClose: onClose 
     } 
    }; 

這與您的示例完全相同,唯一的區別在於,在將對象傳遞給對象之前,我使用了一個變量來獲取對匿名函數的引用。如果您需要了解更多關於物體的信息,我建議您閱讀MDN docs。無論如何,如果你真的對JS的工作方式感興趣,我建議Javascript Garden,這是一個關於JS的非常好的文章。

+0

請問您可以寫一些關於標籤 –

+0

中的函數的定義以及我可以爲匿名函數做些什麼。 –

+0

它們就像普通函數一樣,但它們是未命名的,所以不能在沒有引用它們的情況下訪問它們。如果你編寫'function(){... code ...}',它將不會在任何地方使用,因爲它沒有被引用的名字。 –

0

有關於這個問題here

函數可以有一個名字,如果指定了不能改了很多有用的信息。函數也可以像JavaScript中的任何其他對象一樣分配給變量。

第一個例子是一個函數聲明:

function myfunc(){ 
} 

使用函數的聲明,你將能夠在該函數聲明封閉範圍內的任意位置調用該函數,即使是後宣佈它被使用。

另外兩個例子是函數表達式:

var myvar = function(){ 
/*some code*/ 
} 

var SqueezeBox= { 
    presets: { 
     onOpen:function(){/* empty function body */}, 
     onClose:function(){/*empty function body */} 
    } 
} 

使用你給一個變量賦值功能函數表達式。當你這樣做時,你必須在使用它們之前聲明它們。大多數時候,你看到這個功能將是匿名的,但它有可能舉出在表達式中的函數:

var myvar = function myFunc(){ 
    myFunc(); // Because it has a name you can now call it recursively 
} 

如果這樣做,myFunc功能是唯一可用的函數體中,因爲它是仍然是函數表達式而不是聲明。

第三個示例聲明瞭一個javascript對象字面值SqueezeBox,在該對象內有另一個名爲presets的對象。在這個對象內還有兩個對象/標籤,稱爲onOpenonClose。這意味着你可以做以下使用這些功能:

SqueezeBox.presets.onOpen(); 
SqueezeBox.presets.onClose(); 

你可以認爲的OnOpen和OnClose中的作爲作爲對象的部分變量。因此它與進行以下操作非常相似(但該變量僅在presets對象的範圍內,該對象僅在SqueezeBox對象中可用)。

var onOpen = function() {}; 
相關問題