函數(shù)是由事件驅(qū)動的或者當它被調(diào)用時執(zhí)行的可重復使用的代碼塊哥艇。
定義函數(shù)
語法
function funcName(x) {
... // 函數(shù)體
}
解釋:
-
function
指出這是一個函數(shù)定義毅哗; -
JavaScript
對大小寫敏感。關鍵詞function
必須是小寫的; -
funcName
是函數(shù)的名稱迫卢; -
(x)
括號內(nèi)列出函數(shù)的參數(shù),多個參數(shù)以,分隔冶共; -
{ ... }
之間的代碼是函數(shù)體乾蛤,可以包含若干語句,甚至可以沒有任何語句捅僵。
==注意:== 函數(shù)體內(nèi)部的語句在執(zhí)行時家卖,一旦執(zhí)行到return
時,函數(shù)就執(zhí)行完畢庙楚,并將結果返回上荡;如果沒有return
語句,函數(shù)執(zhí)行完畢后也會返回結果醋奠,只是結果為undefined
榛臼。
實例
// 求絕對值
function abs(x) {
if (x >= 0) {
return x;
} else {
return -x;
}
}
// 求和
function sum(x, y) {
return x + y;
}
由于JavaScript
的函數(shù)也是一個對象伊佃,上述定義的abs()
函數(shù)實際上是一個函數(shù)對象,而函數(shù)名abs
可以視為指向該函數(shù)的變量沛善。
因此航揉,第二種定義函數(shù)的方式如下:
var abs = function (x) {
if (x >= 0) {
return x;
} else {
return -x;
}
};
function (x) { ... }
是一個匿名函數(shù),它沒有函數(shù)名
通過變量abs
就可以調(diào)用該函數(shù)
上述兩種定義完全等價金刁,注意第二種方式按照完整語法需要在函數(shù)體末尾加一個;
帅涂,表示賦值語句結束
調(diào)用函數(shù)
abs(10); // 返回10
abs(-9); // 返回9
abs(); // 返回NaN
sum(10, 20); // 返回 30
變量作用域
局部作用域
在JavaScript中,用var申明的變量實際上是有作用域的尤蛮。
如果一個變量在函數(shù)體內(nèi)部申明媳友,則該變量的作用域為整個函數(shù)體,在函數(shù)體外不可引用該變量:
function foo(x) {
var y = 1; // 此變量 `y` 只能在 foo {...} 大括號內(nèi)部使用
return x + y;
}
如果兩個不同的函數(shù)各自申明了同一個變量产捞,那么該變量只在各自的函數(shù)體內(nèi)起作用醇锚。換句話說,不同函數(shù)內(nèi)部的同名變量互相獨立坯临,互不影響:
function foo() {
var x = 1;
var y = 2;
return x + y;
}
function bar() {
var x = 1;
var z = 2;
return x + z;
}
兩個函數(shù)內(nèi)部的變量 x
互不影響
由于JavaScript的函數(shù)可以嵌套焊唬,此時,內(nèi)部函數(shù)可以訪問外部函數(shù)定義的變量看靠,反過來則不行:
function foo() {
var a = 0;
function bar() {
var b = a + 3; // bar 可以訪問foo的變量 a
}
var c = b - 1; // error: foo 不可以訪問bar的變量 y
}
全局作用域
不在任何函數(shù)內(nèi)定義的變量就具有全局作用域赶促。實際上,JavaScript默認有一個全局對象window挟炬,全局作用域的變量實際上被綁定到window的一個屬性:
// 全局變量
var welcome = "Hello JavaScript";
alert(welcome); // "Hello JavaScript"
alert(window.welcome); // "Hello JavaScript"
全局函數(shù)
function foo() {
alert('foo');
}
foo(); // 直接調(diào)用foo()
window.foo(); // 通過window.foo()調(diào)用
命名空間
全局變量會綁定到window上鸥滨,不同的JavaScript文件如果使用了相同的全局變量,或者定義了相同名字的頂層函數(shù)谤祖,都會造成命名沖突婿滓,并且很難被發(fā)現(xiàn)。
減少沖突的一個方法是把自己的所有變量和函數(shù)全部綁定到一個全局變量中泊脐。例如:
JavaScript
類似于Swift
也支持命名空間
// 唯一的全局變量MAZY:
var MAZY = {};
// 其他變量:
MAZY.name = 'myName';
MAZY.age = 21;
// 其他函數(shù):
MAZY.foo = function () {
return 'foo';
};