JavaScript函数是指一个特定代码块,可能包含多条语句,可以通过名字来供其它语句调用以执行函数包含的代码语句。
比如我们有一个特定的功能需要三条语句实现
statement1;
statement2;
statement3;
那么每次想实现这个功能的时候就需要写这三句话,很麻烦,我们可以把这三条语句打包为一个函数
function doSomething(){
statement1;
statement2;
statement3;
}
这样每次想实现功能的时候我们就调用一下函数就可以了,调用函数通过函数名称()的形式调用
doSomething();
声明函数
ECMAScript规定了两种声明函数方式
函数声明
function functionName(){
statement;
}
使用function关键字可以声明一个函数,看个例子
var printName = function(){
console.log('Byron');
};
函数表达式
var printName = function(){
console.log('Byron');
};
参数
上面定义的函数有一个缺陷,就是过于僵化,只能打印Byron,当我们希望打印Casper的时候就需要一个新的函数,这也是很复杂的,我们可以通过参数的方式来让函数能灵活一些
function printName(name){
console.log(name);
}
printName('Byron');
printName('Casper');
可以看出我们在定义函数的时候在括号内写了个name做占位符,也就是在定义函数的时候也不知道要输出什么,用个占位符代替,在函数实际执行的时候,用真实的值替代占位符
我们说的占位符在术语上叫做形参,也就是形式参数,而在调用函数的时候传入的值叫做实参,也就是实际的参数
函数在定义的时候可以写多个参数
function printPersonInfo(name, age, sex){
console.log(name);
console.log(age);
console.log(sex);
}
auguments
在函数内部,你可以使用arguments对象获取到该函数的所有传入参数
function printPersonInfo(name, age, sex){
console.log(name);
console.log(age);
console.log(sex);
console.log(arguments);
}
返回值
有时候我们希望在函数执行后给我们一个反馈,就像表达式一样,给我们个结果,我们可以通过return来实现
function fn(a, b){
a++;
b++;
return a + b;
}
var result = fn(2, 3);
conslole.log(result);
这样我们就能拿到函数希望给我的反馈了,调用return后,函数立即中断并返回结果,即使后面还有语句也不再执行
其实我们不写return语句,函数也会默认给我们返回undefined
声明提前
和变量的声明会前置一样,函数声明同样会前置,如果我们使用函数表达式那么规则和变量一样
console.log(fn); //undefined
var fn = function(){}
如果我们使用函数声明的方式,那么即使函数写在最后也可以在前面语句调用,前提是函数声明部分已经被下载到本地
fn(); // "1"
function fn(){
console.log('1');
}
作用域
作用域(scope)指的是变量存在的范围。Javascript只有两种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;另一种是函数作用域,变量只在函数内部存在。
在函数外部声明的变量就是全局变量(global variable),它可以在函数内部读取。
var v = 1;
function f(){
console.log(v);
}
f()
// 1
在函数内部定义的变量,外部无法读取,称为“局部变量”(local variable)。
function f(){
var v = 1;
}
v // ReferenceError: v is not defined
函数内部定义的变量,会在该作用域内覆盖同名全局变量。
var v = 1;
function f(){
var v = 2;
console.log(v);
}
f() // 2
v // 1