脚本宝典收集整理的这篇文章主要介绍了Javascript作用域与闭包详情,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
简单来说,作用域是指程序中定义变量的区域,它决定了当前执行代码对变量的访问权限
在ES5中,一般只有两种作用域类型:
说完概念,我们来看下面这段代码:
VAR a = 100 function test(){ var b = a * 2 var a = 200 var c = a/2 console.LOG(b) console.log(c) } test() // 这里会打印出什么?
解析:
所以最终会打印出 NaN,100
在ES6中,新增了一种块级作用域
简单来说,花括号{...}
内的区域就是块级作用域,但Javascript
并不是原生支持块级作用域的,需要借助ES6
提出的let
、const
来创建块级作用域
// ES5 if(true) { var name = '南玖' } console.log(name) // 南玖 // ES6 if(true) { let age = 18 } console.log(age) // 这里会报错
当可执行代码内部访问变量时,会先查找当前作用域下有无该变量,有则立即返回,没有的话则会去父级作用域中查找...一直找到全局作用域。我们把这种作用域的嵌套机制称为作用域链
词法作用域
是作用域的一种工作模型,词法作用域是JavaScript
中使用的一种作用域类型,词法作用域也可以被叫做静态作用域
。
所谓的词法作用域就是在你写代码时将变量和作用域写在哪里来决定的,也就是词法作用域是静态的作用域,在你写代码时就决定了。函数作用域取决于它申明的位置,与实际调用的位置无关
MDN对闭包的定义:
一个函数和对其周围(词法环境)的引用捆绑在一起(或者说函数被引用包围),这样一个组合就是闭包(closure
)
也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在JavaScript
中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。
我们可以得出:
闭包 = 函数 + 外层作用域
我们先来看段代码:
var name = '前端南玖' function say() { console.log(name) } say()
解析:say
函数可以访问到外层作用域的变量a,那么这样不就是形成了一个闭包吗?
在《Javascript权威指南》书中有这样一句话:严格来讲,所以JavaScript
函数都是闭包
但这只是理论上的闭包,与我们平时使用的不太一样。上面这个例子只是一个简单的闭包。
ecmascript对闭包的定义:
我们再看一段《JavaScript权威指南》上的代码:
let scoPE = 'global scope' function checkscope(){ let scope = 'local scope' function f(){ return scope } return f } let s = checkscope() s() // 这里返回什么?
很多同学可能觉得是global scope
,但真的是这样吗,我们一起来看下它的执行过程:
scope
并赋值checkscope
函数,并创建该函数的执行上下文,创建局部变量scope
并赋值checkscope
函数,该函数又返回了一个f函数赋值给了变量sscope
是local scope
。至于为什么是local scope
,我们上面讲到了词法作用的基本规则:JavaScript
函数是使用定义它们的作用域来执行的。在定义f函数的作用域中,变量scope
的值为local scope
闭包的应用,绝大多是都是在维护内部变量的场景下使用
var arr = [] for(var i=0;i<3;i++){ arr[i] = function(){ console.log(i) } } arr[0]() // 3 arr[1]() // 3 arr[2]() // 3 // 这里在执行的时候i已经变成了3 // 使用闭包解决 var arr = [] for(var i=0;i<3;i++){ arr[i] = (function(i){ return function(){ console.log(i) } })(i) } arr[0]() // 0 arr[1]() // 1 arr[2]() // 2
到此这篇关于Javascript作用域与闭包详情的文章就介绍到这了,更多相关Javascript作用域与闭包内容请搜索脚本宝典以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本宝典!
以上是脚本宝典为你收集整理的Javascript作用域与闭包详情全部内容,希望文章能够帮你解决Javascript作用域与闭包详情所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。