JS 中变量、常量、函数、作用域及闭包的初步认识
变量和常量的区别
- ES6 中,变量的声明使用 let 关键字,常量使用 const 关键字
- 变量可以先申明后赋值,常量在声明的同时必须赋值
- 变量的值可以被多次修改,常量的值不能被修改
函数的种类
1.普通函数
语法:
function sum(n1, n2) { return n1 + n2; }
2.匿名函数
语法:
function (n1, n2) { return n1 + n2; };
3.立即执行函数(IIFE)
语法:
(function (n1, n2) { return n1 + n2; })(10,20);
4.箭头函数
箭头函数是对匿名函数的一种简化方式
function (n1, n2) { return n1 + n2; };
<!--用箭头函数简化-->
(n1, n2) => n1 + n2;
5.标签函数
标签函数就是使用模板字符串做为参数的函数
//函数定义
function sum(strings, number, price) {
return `${strings[0]}${number}
${strings[1]}${price}
总金额:${number * price}`;
}
//函数调用
sum`数量:${10}单价:${1900}`;
作用域和闭包
作用域主要有以下二种:
- 全局作用域:函数外定义的,全局都能访问
- 函数作用域:函数内定义的,只能在当前函数内部访问
由于作用域的存在,函数在查找变量时,会从当前作用域开始,逐级向上查找,形成一条作用域链。当满足特定条件时,函数会形成闭包。形成闭包的二个基本条件:
- 存在嵌套函数
- 子函数引用外部函数的自由变量(非全局)
简单理解:闭包就是子函数引用了外部作用域(非全局)的自由变量,导致外部函数无法被释放。
示例:
//这个 函数形成闭包
function funcA() {
let i = 0;
function funcB() {
return (i = i + 1);
}
return funcB;
}
//函数调用
let f = funcA(); //调用funcA,返回 functB,执行完成后funcA不会被释放,因为其内部变量i被funcB引用着
let result = f(); //相当于调用functB,此时返回值=1
result = f(); //相当于再次调用functB,此时返回值=2
result = f(); //相当于再次调用functB,此时返回值=3
console.log(result);