1.函数声明方式
1.通过function关键字进行声明
function fn(){ }
2.通过函数表达式方式赋值声明
var fn = function(){ }
3.利用构造函数Function声明
var fn = new Function('参数','函数体')
//1.这种写法是将参数列表和函数体放置在了一起同样作为了参数。
//2.如果只有一个参数,那这个参数就是函数体。(就是花括号里面的代码)
//3.构造函数内的参数无论有多少个,始终会将其最后一个参数作为函数体去执行
//4.参数和函数体的语句要作为字符串去呈现
需要注意的是第一种使用‘function’关键字声明的函数,声明会提前(整体提前)。
还有一点是函数重复声明,后面的会覆盖前面的。
2.函数的返回值
- 每一个函数都会有一个返回值,这个返回值可以通过关键字“return”进行设置
- 若未显式地设置函数的返回值,那函数会默认返回一个undefined值
- 但若手动地设置了函数的返回值(return)后,函数将返回开发者手动设置的那个值
- 在函数中,一旦执行完成“return”语句,那么整个函数就结束了,后续语句将不再执行;
- 就是“return”之后的值只能有一个。如果尝试返回多个值,那得到的结果始终是最后一个值
- 如果真的需要函数返回多个值,那就只有将值组合成一个对象或数组进行返回
3.函数的参数
1.形参 和 实参
形参:声明函数时写得参数
实参:调用函数时传入的参数
函数最后的执行结果是由实参决定的
2.对位传参法
//定义函数
function fn(a,b){
console.log(a,b)
}
//调用函数
fn(2,1)
- 形参与实参是通过位置而不是参数名来匹配对应的
- 形参与实参的个数可以不一致
- 如果一个形参没有接收到实参传递来的值,那么他为undefined
3.对象传参法
- 当参数非常多时,想要不在通过位置来匹配参数,想让参数具有确定性,那么可以使用对象作为参数,然后就可以通过属性名key来匹配。
如果我们在传入实参时忘记输入值,那么函数得到的参数将是一个undefined,我们给参数设置默认值
//ES5方法
//第一种三目运算符设置
function fn(a){
a = (a == undefined) ? 0 : a;
console.log(a);
}
//第二种使用逻辑或设置
function fn1(a){
a = a || 1;//如果传入的是undefined那么相等于false所以会取第二个默认值
console.log(a);
}
//第二种方法会有一个弊端那就是除了undefined,传入null,0,'',NAN都等于false都会取到第二个默认值
//ES6方法
//直接在形参上赋值默认值即可
function fn3(a=1){
console.log(a);
}
Arguments参数列表
他代表的是函数的所有参数,是一个类似于数组的集合,也可以通过下标获取对应值。
如果我们想要将其转换为数组的话可以使用
1.调用数组原型链上的方法转换
Array.prototype.slice.call(arguments);
2.调用from方法
Array.from(arguments);
4.函数的作用域
JavaScript中分为1.全局作用域 2.函数作用域 3.块级作用域(注意:在ES5中变量作用域只分为两种类型,一种是“全局作用域”,一种是“函数作用域”。在es6里面才拥有块级作用域,即if判断、for循环等语句都有自己独立的作用域)。
1.全局作用域
在当前文件中的所有函数,块中都有效,不管let还是var
//定义全局变量
var test = 666;
function fn(){
console.log(test);
}
fn();
2.函数作用域
只在某个函数里面有效,不管是var或者let都可以
function fn(){
var test = 666;
console.log(test);
}
fn();
console.log(test);
3.块级作用域
只在if判断、for循环等语句里面有效,需要使用let关键字声明
for(let i = 0;i < 10;i++){
console.log(i);
}
console.log(i);
- 访问优先级:里层能访问外层,外层不能访问里层
- 块级能访问局部,局部能访问全局,
- 全局不能访问局部,局部不能访问块级
- 访问变量时,先在当前作用域查找,然后在去上层作用域查找
let声明的一些说明
1.let声明的变量具有块级作用域
2.let声明不能够重复声明
3.let声明的变量不会声明提前
函数规范写法
函数作为一个可以反复被调用的代码块,应该具有其独立性,函数与全局的交流应当只通过参数和返回值,减少对全局的依赖,即不应该直接去获取外面的他所需要的变量等。