※函数 function
目的:封装一段可重复调用的代码块 让大量代码重复使用
函数注意点:封装函数 不做过分兼容
使用方法:
声明函数:
// 1.命名函数
function 函数名(形参) {
//执行代码 在需要函数返回数据时要通过return来返回
return 需要返回的值/形参;
};
// 2.调用函数:函数名(实参);
// 在实际开发中的调用函数
var 变量名 = 函数名(实参/传入的数值);
console.log(变量名);
// 定义一个变量储存 在打印/输出的时候只要填写变量名就ok了
// 1.函数表达式(匿名函数)
var 变量名 = function(形参) {...};
// 2.调用函数:变量名(实参);
// 函数表达式:变量名和普通变量不同 这里变量存的是函数
注 :
- 声明function名称全小写 函数名以动词命名
- 不调用函数自身不会执行
- 函数调用需要小括号
- 函数两个括号内可以不写参数
函数的参数
参数可以无个数不限 参数之间用逗号隔开 形参和实参个数要匹配
形参:
-
形参写在声明括号内
-
接受实参的值
实参:
- 写在调用括号内
- 给形参传递实际数据
- 实参个数多余形参个数 会丢掉多余的实参
- 实参个数小于形参 形参没有接受到值 多余的形参默认未定义
- 和数字相加会变成nan
函数返回值 return
作用:将最终结果返回给函数调用者
- return 后的代码不被执行
- 只能返回结果是 最后一次运行结果的值
- 返回一个以上的值可以用数组
- 函数没有return返回的是未定义
// 语法:
function 函数名() {
return 需要返回的值;
}
console.log(函数名()); //调用者 返回的值
调用函数
函数可以互相调用
function 函数名1() {
// 函数体
函数名2();//调用函数2
// 函数体2
}
function 函数名2(){
// 函数体
}
函数名1() // 函数1的调用
// 流程:先执行写在外层的调用 从上往下执行 先执行函数1的内容 调用了函数2 此时去往函数2调用里面的内容 在回到函数1 接着执行剩下的内容
// 注:调用的函数名不能忘记小括号
通过榨汁机看透函数
函数作业
arguments
- 是函数的一个内置对象 只有函数有
- 存储传递过来的全部实参
- 不推荐使用 一般采用函数+数组代替
// 函数+数组
function sort(arr) {
//函数体
return arr;
}
var arr1 = sort([1, 4, 2, 9]);
console.log(arr1);
伪数组
- 具有数组的数组长度的特性
- 按照索引的方式来存储
- 没有真正数组的方法pop push
标志变量
一个标志 一般在代码中用做一个开关 在代码结束后还需要用到结果的时候用标志变量
例:假设最先开始是对的 在经历了某个代码后 转换为了错了 就可以根据这个来判断它是否走了某个代码 来做一些其他操作
注: 里面不仅可以是布尔值 还可以是字符 数字等 依照代码的情况来定
作用域
作用:限制名字起作用的域范围
优点:提高程序逻辑局部性 增强可靠性 减少名字冲突
作用域的两种:
- **全局作用域:**整个script标签 或者单独的js文件
- 注:没有声明的变量 = 全局变量
- 只有浏览器关闭才会销毁
- 函数作用域: (局部作用域):只在函数内部起作用
- 注: 函数的形参也是局部变量
- 函数运行完毕就会销毁
es5 js没有块级作用域:只有被函数包裹才有块级作用域 for循环在es6之前可以在循环外调用循环中里面的i
作用域链: 内部函数可以访问外部函数 实行就近查找
域解析 √
引擎会把变量和函数声明提升到当前作用域的最前面 代码从上往下执行 匿名函数没有提升
如何避免: 符合规范 先声明 后调用
注:函数提升里面的函数体跟着一起往上
域解析案例4 √
f1();
console.log(c);
console.log(b);
console.log(a);
function f1() {
var a = b = c = 9;
console.log(a);
console.log(b);
console.log(c);
}
域解析后
function f1() {
var a = 9; // a是局部变量 所以外围不能获取数据
b = 9; //b c 是全局变量 所以外围的输出可以获取
c = 9;
console.log(a); //9
console.log(b); //9
console.log(c); //9
}
f1();
console.log(c); //9
console.log(b); //9
console.log(a); //undefined