浅析作用域、自由变量、闭包

作用域 全局作用域: 变量未受到函数的约束,在全局可以使用,如windows对象,document对象 函数作用域: 在函数中定义的变量只能在当前函数中有效 块级作用域(ES6):在某个{}声明的,只在当前{}有效 自由变量 一个在当前作用域中没有定义,但是被使用了 向上级作用域,一层一层一席寻找,直至找到为止 如果到全局作用域都没找到则报错 xx is not defined let a=0 function fn1(){ let a1=100 function fn2(){ let a2=200 function fn3(){ let a3=300 return a+a1+a2+a3 } } } fn1() 在实例方法fn3中,a、a1、a2均为自由变量 闭包 作用域应用的特殊情况,有两种表现: 1、函数作为返回值被返回 2、函数作为参数被传递 1. 函数作为返回值 function create() { let a = 100 // step2. 在上级作用域找到a,故打印100 return function () { console.log(a) // step1. 当前作用域中未找到 a,a为自由变量 } } let fn = create() let a = 200 fn() //100 结果分析:函数作为返回值时,根据结果发现打印了create方法作用域下的a,根据自由变量逐层向上寻找的规则,故自由变量a是从createn内定义的方法里面向上查找的,不是在方法fn()执行的地方。 2. 函数作为参数被传递 function print(fn){ const a=200 fn() } const a=100 //step2. 在上级作用域找到a,故打印100 function fn(){ console.log(a) //step1. 当前作用域中未找到 a,a为自由变量 } print(fn) //100 结果分析:函数作为参数被传递时,根据结果发现打印了全局作用域下的a,根据自由变量逐层向上寻找的规则,故自由变量a是从定义的fn()方法里面向上查找的,不是在还函数print内执行fn()的地方。 闭包:所有自由变量的查找,是在定义函数的地方,向上级作用域查找,不是在函数执行的地方!!!

本文章由javascript技术分享原创和收集

发表评论 (审核通过后显示评论):