作用域
- 全局作用域
- 函数作用域
- 块级作用域 ( ES6 新增)
// 块级作用域
if (true) {
let x = 100;
}
console.log(x) // 报错
自由变量
- 一个变量在当前作用域没有定义,但是被使用了
- 向上级作用域,一层一层依次寻找,直到找到为止
- 如果全局作用域都没有找到,则报错 xx is not defined
函数
标准函数

function.png
匿名函数
// 缺少函数名
function (){
console.log('匿名函数')
}
函数调用方式
// 在函数外面包括一层括号
(function (){
console.log('匿名函数')
})
// 匿名函数自运行
// 被括号包裹的函数变成一个整体,即可以自运行
(function (args){
console.log('匿名函数')
})(args)
不写函数名便可运行函数的方式
- 小括号包裹:括号()作为运算符,除了提升运算优先级外,在这里将函数的声明,变成了优先执行的表达式。表达式的运行需要由返回结果,这个返回结果就是函数本身,拿到函数本身后,即可调用
// 小括号包裹:括号()作为运算符,除了提升运算优先级外,在这里将函数的声明,
// 变成了优先执行的表达式。表达式的运行需要由返回结果,这个返回结果就是函数本身,拿到函数本身后,即可调用
(function (){})()
闭包
闭包介绍
闭包是作用域应用的特殊情况,主要表现为:
- 函数作为参数被传递
- 函数作为返回值被返回
注:闭包:自由变量的查找,是在函数定义的地方,向上级作用域查找,不是在执行的地方!!!
// 函数作为返回值
const closure = () => {
// 补全代码
let count = 0;
return function() {
count++;
// count来自于 func 定义的作用域
return count
}
}
const fn = closure();
const count = 100;
console.log(fn()); // 1;
// 函数作为参数
function print(func) {
const a = 200;
func();
}
const a = 100;
function func() {
// a 来自于 func 定义的作用域
console.log(a); // 100
}
print(func)
题目描述
要求每次调用函数"closure"时会返回一个新计数器。每当调用某个计数器时会返回一个数字且该数字会累加1。
注意:
- 初次调用返回值为1
- 每个计数器所统计的数字是独立的
题解
返回一个函数,每次调用该函数返回值会加1,核心步骤有:
- 声明一个数字变量,初始值为0
- 返回一个匿名函数,该匿名函数使数字变量加1,并且返回这个数字
const closure = () => {
// 补全代码
let count = 0;
return function() {
count++;
return count
}
}
const time1 = closure();
const time2 = closure();
let t1 = time1();
console.log(t1);
t1 = time1();
console.log(t1);
let t2 = time2();
console.log(t2);
t2 = time2();
console.log(t2);
t2 = time2();
console.log(t2);
this
- this 取什么值,是在函数调用时确定的,不是在函数定义时确定的