函數包含需要反復執行的代碼塊。函數可以取零個或多個參數,并且可以可選的返回一個值。
函數可以通過各種方式創建,其中兩個方式如下:
~~~
// Function declaration.
function foo() {
// Do something.
}
~~~
~~~
// Function expression.
var foo = function() {
// Do something.
};
~~~
## 使用函數
~~~
// A simple function.
var greet = function( person, greeting ) {
var text = greeting + ", " + person;
console.log( text );
};
greet( "Rebecca", "Hello" ); // "Hello, Rebecca"
~~~
~~~
// A function that returns a value.
var greet = function( person, greeting ) {
var text = greeting + ", " + person;
return text;
};
console.log( greet( "Rebecca", "Hello" ) ); // "Hello, Rebecca"
~~~
~~~
// A function that returns another function.
var greet = function( person, greeting ) {
var text = greeting + ", " + person;
return function() {
console.log( text );
};
};
var greeting = greet( "Rebecca", "Hello" );
greeting(); // "Hello, Rebecca"
~~~
## 立即調用函數表達式(IIFE)
在 JavaScript 中一個常見的模式是立即調用函數表達式。這種模式創建一個函數表達式然后立即執行。IIFE 在要避免污染全局命名空間的情況下非常有用 - 函數內聲明的變量,在外部是不可見的。
~~~
// An immediately-invoked function expression.
(function() {
var foo = "Hello world";
})();
console.log( foo ); // undefined!
~~~
## 作為參數的函數
在 JavaScript 中,函數是“一等公民” - 它們可以被賦給變量或者作為參數傳遞給另一個函數。傳遞函數作為參數是 jQuery 中的慣用法。
~~~
// Passing an anonymous function as an argument.
var myFn = function( fn ) {
var result = fn();
console.log( result );
};
// Logs "hello world"
myFn( function() {
return "hello world";
});
~~~
~~~
// Passing a named function as an argument
var myFn = function( fn ) {
var result = fn();
console.log( result );
};
var myOtherFn = function() {
return "hello world";
};
myFn( myOtherFn ); // "hello world"
~~~