闭包定义
闭包是指有权访问另一个函数作用域中变量的函数,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。
闭包使用场景
- return返回函数(经典)
var n = 10 function fn(){ var n =20 function f() { n++; console.log(n) } return f } var x = fn() x() // 21 x() // 22
- 循环赋值
for(var i = 0; i<10; i++){ (function(j){ setTimeout(function(){ console.log(j) }, 1000) })(i) }
- 回调函数
window.name = '林一一' setTimeout(function timeHandler(){ console.log(window.name); }, 100)
- 节流防抖
// 节流 function throttle(fn, timeout) { let timer = null return function (...arg) { if(timer) return timer = setTimeout(() => { fn.apply(this, arg) timer = null }, timeout) } } // 防抖 function debounce(fn, timeout){ let timer = null return function(...arg){ clearTimeout(timer) timer = setTimeout(() => { fn.apply(this, arg) }, timeout) } }
函数执行上下文
是一种对javascript代码执行环境的一种抽象概念,只要有代码运行,那么他一定是运行在执行上下文中。
每当运行代码时,就会创建执行上下文。
执行上下文分三种
- 全局执行上下文
- 最基础的执行上下文,所有不在函数中的代码都会在全局执行上下文中执行。一个程序中只能有一个。
- 函数执行上下文
- 每次调用函数时,都会为该函数创建一个执行上下文,每一个函数都有自己的执行上下文。
- Eval函数执行上下文
- 在eval函数中执行的代码也会有自己的执行上下文。
执行上下文的创建分为两个阶段
作用域链
新
创建阶段:
- this绑定
- 确定词法环境
- 词法环境:
- 环境记录器:let、const存储进去
- 外部环境引用:指向null
- 词法环境:
- 确定变量环境
- 用var,初始化为undefined
首先,JavaScript属于解释型语言,JavaScript的执行分为解释和执行两个阶段,这两个阶段所做的事并不一样:
解释阶段:
- 词法分析
- 语法分析
- 作用域规则确定
执行阶段:
- 创建执行上下文
- 执行函数代码
- 垃圾回收