17. 函数部分内容补充
17.1 函数的四种形式
1 无参无返回值:常用于代码的复用,或是功能代码段。
2 无参有返回值:函数被调用后的返回值与调用者无关。
function f1(){
return 20;
}
3 有参无返回值:函数设有参数,但是没有特定的返回值。
function sayHi(name){
console.log("你好啊"+name);
}
4 有参有返回值(JS中最多使用的类型)
function getMax(arr){
var max = arr[0];
for(var i=1;i<arr.length;i++){
max = max<arr[i]?arr[i]:max;
}
return max;
}
注意:无返回值是指没有return语句,而不是真的没有返回值,这时的返回值默认为undefined。
17.2 函数的重载
重载的含义:就是指拥有相同的函数名,但是函数的参数个数不同或者参数的类型不同时的函数,这时可以通过函数参数的个数和参数的数据类型来选择对应的函数。
但是在JS中如有重名的函数,后面的函数会将前面的函数覆盖掉,前面的函数无法再被调用了。
function getSum(a,b){
return a+b;
}
function getSum(a,b,c){
return a + b +c;
}
var sum = getSum(10,20);
console.log(sum);
如上述代码声明了两个函数名相同但是函数的参数数量不一样的函数,最终代码会输出NaN,即选择了第二个函数进行了调用执行。(注意:这个函数中c未赋值,所有函数默认c为undefined,转换为number类型数据就是NaN。NaN参与运算后的结果还是为NaN。)
17.3 函数表达式的方式声明函数
指将一个函数通过赋值给一个变量的方式声明函数,这个函数没有函数名。在调用函数时可以通过变量名+()的形式调用变量名对应的函数。
var fun = function(a,b){
return a-b;
};
fun(50,70);
17.4 匿名函数
匿名函数就是没有函数名的函数,在使用函数表达式的方式声明的函数就是匿名函数。
17.5 函数的声明方式与函数表达式的区别
1 函数的声明方式中的函数有函数名;
2 函数表达式的方法中的函数没有函数名,是匿名函数;
3 在函数预解析的时候,会先将函数声明提前到作用域的最前面,而函数的表达式不会提升;
4 函数声明方式中的函数,可以先调用再声明,但是函数表达式方式的函数必须在函数表达式语句之后才能被调用。
17.6 函数的预解析
在程序的执行代码之前,会将所有的代码扫描一遍,将所有变量的声明、函数的声明、函数的参数提升到当前作用域的最前面,这时通过函数声明方式声明的函数会整个提升,但是通过函数表达式声明的函数只能将变量的声明部分提升,而函数的表达式部分还留在原代码位置未提升,所有如果在函数表达式之前调用函数的话,程序会报错提示这个变量没有定义值。
17.7 自执行函数
自执行函数指可以自己执行的函数。
(function(){
console.log("这是一个f2的函数");
})();
(function(){
console.log("这是一个f3的函数");
console.log("看看我有没有执行");
}());
这是两个自执行函数的表达方式。自执行函数没有函数名,函数在定义之后马上进行调用。
这种函数多用于一次性使用的时候,避免了函数名的重复和冲突。
18. 变量的作用域
JS中只存在全局作用域和局部作用域,没有块级作用域。
18.1 块级作用域
若在{}之间包裹的区间中单独声明了变量,且这个变量无法在{}区间外被调用的话,这个变量就是块级变量,而{}区间就是块级作用域。
而在JS中不存在块级作用域。如:
{var m = 100;}
console.log(m);
在JS中可以在{}区间外读取到{}区间内声明的变量。
18.2 全局作用域
指变量可以在任何地方被读取到,则这个变量就是全局变量,而全局作用域就是指在页面中所有script标签之间的区域。
全局变量有两种:
1 全局作用域内声明的变量。
2 在函数内部除函数参数以外,不使用var定义的变量,也是全局变量。
18.3 局部作用域
如在一个函数内声明的变量,无法在这个函数范围以外的地方被读取,就说明这个变量为局部变量,而这个函数就是一个局部作用域。