JS中作用域与闭包分别是什么含义,用法是怎样
Admin 2022-06-30 群英技术资讯 781 次浏览
这篇文章主要介绍“JS中作用域与闭包分别是什么含义,用法是怎样”,有一些人在JS中作用域与闭包分别是什么含义,用法是怎样的问题上存在疑惑,接下来小编就给大家来介绍一下相关的内容,希望对大家解答有帮助,有这个方面学习需要的朋友就继续往下看吧。简单来说,作用域是指程序中定义变量的区域,它决定了当前执行代码对变量的访问权限
在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
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
JQuery复选框全选效果如何实现,具体代码如下,感兴趣的朋友可以参考。
vue中watch是什么?watch就是监测 Vue 实例变化的一个表达式或方法。回调函数得到的参数为新值和旧值,用一个函数取代。那么vue中watch的用法又是什么呢?在vue中watch的用法大致有三种,包括常用用法,立即执行和深度监听。下面我们来具有看看。
VUE+Element 前端应用实现国际化的处理还是非常方便的,一般在Main.js函数里面引入语言文件,然后在界面上进行一定的处理,把对应的键值转换为对应语言的语义即可。本篇随笔介绍在VUE+Element 前端应用中如何实现在界面快速的支持多语言国际化的处理逻辑代码。
jquery获取select选中的值示例详解,js获取选中option的value值很简单,下面看本jquery教程的:selected选择器的使用。 html代码部分 selectoptionvalue=1张三/optionoptionvalue=2selected=selected李四/optionoptionvalue=3王五/option/selectbuttonid=getS
目录场景方式一方式二场景使用ElementUI中的Table 表格时,如果列内容超过列宽,会默认换行,如下这样看起来不美观,还有可能引起其它样式问题。那么如何解决呢?方式一使用Table组件自带的show-overflow-tooltip属性参数说明类型可选值默认值show-overflow-tooltip当内容过长被
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008