作用域
- 全局作用域
- 函数作用域
- eval 作用域
- 块级作用域 (ES6+ 才引入)
闭包
- 闭包是词法作用域的体现,内部函数可以访问函数外面的变量
- 只要在一个函数中再定义一个函数,这个内部函数就是一个闭包
- 闭包之所以能访问其外层函数作用域中的变量,是因为闭包的作用域链中存在外层函数的变量对象。即使外层函数执行结束,但由于其变量对象仍然被内层函数的作用域引用,因此不会被内存回收,直到闭包执行结束后,外层函数的变量对象才会被回收
- 闭包的作用
- 可以实现私有变量
- 可以使得某些变量保存在内存中
this
this 就是函数运行时所在的环境对象。一共有四种情况:
纯粹的函数调用
// 以下两者情况 `this` 只依赖于调用函数前的对象,优先级是第二个情况大于第一个情况 function foo() { console.log(this.a) } var a = 1 foo() // 1
作为对象方法的调用
function foo() { console.log(this.a) } var obj = { a: 2, foo: foo } obj.foo() // 2
作为构造函数调用
function foo() { this.a = 2 } var a = 1 const obj = new foo() console.log(obj.a) // 2
call, apply, bind 调用
var bob = { name: 'Bob', sayInfo: function (age, school) { return `Name: ${this.name}. Age: ${age} years old. Studying at ${school}.` } }; var violet = { name: 'Violet', }; console.log(bob.sayInfo.call(violet, 13, 'abc')); // Name: Violet. Age: 13 years old. Studying at abc.