2014-01-14 20 views
0

我剛開始編程,我一直在玩它。我在lynda.com上看過一門編程課程,但它並沒有涵蓋功能,我知道它們是什麼,但我不知道不同的函數格式或如何調用它們。我知道該怎麼稱呼簡單的事情是這樣的:如何在Javascript中調用不同類型的函數

var foo=function { 
    //code... 
} 

,但我想用更復雜的東西像這樣(我開始的事情與HTML):

$(document).keypress(function(e)) { 
    if(e.which == 13) { 
     alert('You pressed enter!'); 
    } 
}); 

或者只是任何其他有風格。

+0

你或許應該完成的教程或閱讀有關JavaScript的一本好書。我推薦「權威指南」 – Munim

+0

你的第一個例子是無效的,你必須在函數後面添加括號:'var foo = function(){/ * code ... * /}'。你的第二個例子可能是jQuery。這不是原生的JavaScript,它是一個框架。在使用框架之前,您應該學習純JavaScript。 –

回答

-1

我個人認爲你過於複雜了。 是的,寫函數的不同方式往往有不同的名稱(函數,匿名函數,閉包,lambda,....),但最後它的所有函數: 它們將幾個語句合併爲一個。

例如:

// Crating a function (most commomn way) 
function a() { 
    alert('a'); 
}; 

// Creating a anonymous (nameless) function and assigning it to b 
var b = function() { 
    alert('b'); 
}; 

var c = a; 
var d = b; 

var e = {}; 
// Creating a function that accepts a function and executes it. 
// This is in essence what $(document).keypress() does 
e.f = function(f){ 
    f(); 
}; 

// Alerts: a 
a(); 

// Alerts: b 
b(); 

// Alerts: a 
c(); 

// Alerts: b 
d(); 

// Sample how you can call $(document).keypress() 
// Alerts: c 
e.f(function() { 
    alert('c'); 
}); 

// Alerts: a 
e.f(a); 

// Alerts: b 
e.f(b); 
2

有功能沒有不同的格式。所有這些都是用function關鍵字後跟參數和正文定義的。如果你有一個功能foo,那麼你可以通過foo();來調用它(你也可以傳遞參數,foo(1,2,3);)。有更復雜的調用函數的方法,例如通過foo.callfoo.apply,但我認爲這裏沒有必要談論這一點。

請注意,JavaScript中的函數是第一類公民。這意味着他們可以被視爲對象。特別是你可以將它們傳遞給另一個函數。看看這個例子:

var foo = function(fn) { 
    return fn()+1; 
}; 

這裏會發生什麼? foo需要函數作爲參數(我們知道因爲fn()在本體中被調用),因此調用它並添加1以產生結果。所以如果我這樣撥打foo

foo(function() { 
    return 1; 
}); 

結果會是什麼?這是一個簡單的例子。考慮更復雜的東西:

var foo = function(list, fn) { 
    var res = []; 
    for (var i = 0; i < list.length; i++) { 
     var mapped = fn(list[i]); 
     res.push(mapped); 
    } 
    return res; 
}; 

這是列表中.map方法的簡單版本。因此,它需要一個列表,並作爲自變量的函數,則該函數適用於列表中的每個元素,並返回一個新的列表:

> foo([1, 2, 3], function(el) { return -el; }); 
[-1, -2, -3] 

它是與調用

> [1, 2, 3].map(function(el) { return -el; }); 
[-1, -2, -3] 
0

你的代碼實際上是不同類型功能的一個很好的例子。首先是$(),它代表JQuery庫 - 這是一個有用的JavaScript附加組件。您通常會給它一個名爲CSS選擇器的字符串,這是一種選取文檔的一部分(或多個部分)的方法。在這種情況下,您正在挑選整個文檔,但您也可以說像$(「#logo」),它將返回一個id =「logo」或$(「img」)的文檔將返回所有元素在文件中。

JS中的對象可以是任何東西,並且存在不同類型的對象。每種類型的對象都具有可用的特殊功能。這些函數被稱爲方法。

在上述例子中,由$(文件)返回的文檔對象具有向它提供的.keypress()方法,它偵聽特定按鍵。按鍵需要知道按下某個按鍵時該做什麼,並且通過將該按鍵作爲參數提供給該功能。每次按鍵時都會執行該功能。

有一兩件事要記住的JavaScript有用的是功能視爲「一等公民」,這意味着他們的直線上升值好儘可能的JavaScript關注。所以,如果我有這樣一個功能:

var myString = function(word) 
    { 
     return word; 
    } 

如果我做的:

 var myWord = "hello"; 

這是一樣的:

 var otherWord = myString("hello"); 

如果我對它們進行比較:

var compareWords = function(word1, word2) 
    { 
     return word1 == word2; 
    } 

    var compareMyWords = compareWords(myWord, otherWord); 

這就像說

一樣
var compareMyWords = true; 

這很重要,因爲它意味着函數可以將其他函數作爲參數而沒有問題。我們看到這種情況發生在按鍵方法中。這可能是一個有點難以察覺,但你可以看到它,如果你事先聲明函數:

var keypressFunction = function(e)) { 
    if(e.which == 13) { 
     alert('You pressed enter!'); 
    } 

以下是與您的例子:

$(document).keypress(keypressFunction); 

不同的是,你的榜樣使用匿名功能。它沒有用「var」或「function」聲明,所以如果我想要的話我不能重用它。這不是一件壞事。當你進入更高級的東西時,匿名函數非常有用。

您的匿名功能允許一個參數,一個對象表示實際上按下的鍵。在這種情況下,如果按下(Enter)鍵代表13所代表的鍵,它只想做點什麼。

最後有警報功能,彈出消息。請注意,函數並不總是必須返回一個值。通常當他們不這樣做時,他們會對自己的環境做些改變(否則有什麼意義)。在你的例子中,只有一個函數實際返回一些東西 - $()函數,雖然沒有用它做,但你可以繼續下去,並用句號替換分號,並使用ready()方法或任何方法可用於由$(document)返回的對象。其實,只要你知道正在返回什麼類型的對象,你可以這樣做:

$("#message").addClass("alert").fadeIn().delay().fadeOut(); 

由於每種方法返回相同的對象,我們可以做到這一點「方法鏈」。 jQuery故意試圖使其大部分方法返回它所作用的DOM對象,以便您可以執行此操作。其他庫,如d3.js,使用方法鏈來進行一些非常酷的視覺轉換。

我不認爲出發使用jQuery是可怕的人可能建議的想法。它仍然是JavaScript。有人可能會爭辯說,JQuery迫使你學習先進的概念(回調,CSS選擇器等),否則你可能會不知所措地拖延多年。我也可以爭辯說,在學習編程時,JavaScript本身就是一種糟糕的語言。

相反,我會說潛水和樂趣!最終的目的是通過以正確的方式做到這一點,不會因爲太糟糕而造成不可思議的事情。在學習和建設之間找到一個很好的平衡點,並且不要被那些來這裏嫉妒的嫉妒的計算器用戶過於沮喪,以此來扼殺他們曾經在構建真棒事物時所帶來的喜悅。聲明的功能

1

不同方式

function A() {};   // function declaration 

var B = function() {};  // function expression 

var C = (function() {}); // function expression with grouping operators 

var D = function foo() {}; // named function expression 

var E = (function() {  // immediately-invoke function expression (IIFE) that returns a function 
    return function() {} 
})(); 

var F = new Function();  // Function constructor 

var G = new function() {}; // special case: object constructor 
相關問題