IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Javascript 中function 作用域跟闭包 -> 正文阅读

[JavaScript知识库]Javascript 中function 作用域跟闭包

好了,还是根据相应的题来说

let x=5;
function fn(x){
return function (y){
console.log(y+(++x))

}
}
let f=fn(6)
f(7)  //14
fn(8)(9) //18
f(10)  //18
console.log(x) //5

你是不是也答对了?那么我来解释一下
上面的代码 就是闭包,闭包有什么特性呢?因为函数执行完事之后,都会出栈销毁,而闭包却能做到fn函数中的形参保留了下来,也就是私有作用域中存在一个x
1.? f=fn(6)---->则 f=function(y){console.log(y+(++x))}
f(7) 这里就 是怎么回事呢?那么function(y){console.log(y+(++x))}中的参数x是那里的x,他就是fn(6)中私有作用域中的x,这就很好理解了,f(7)----->console.log(7+((//fn中的形参x)++6 ))
++6 跟6++ 有什么区别呢,++6是先计算后执行,而6++则是 先执行后计算 在跟大家说个例子,
let num= 6? ??6++ console.log(num)是多少呢 num=7?// 如果没有上一步的计算直接console.log(num++) // 6 这是为什么呢,就是我所说的,先执行后计算,只要一过6++这一步 那么 它的值就已经变成 7 那么++6我就不解释了 看我红色 话语, 那继续回来 此时 fn函数中x此时的值已经是7了,闭包中私有作用域不会消失。
那么 在解释一下 fn(8)(9) 为什么会是18呢 我是这么理解的,暴力一点,直接理解成他就是一个普通函数,跟f(7)毫无关系,就行了 直接执行 结果就是 18
f(10)? 怎么理解呢 在解释 f(7)的说到 存在的私有域 不会消失,此时fn中 x 是多少呢 f(7)执行完 是7? 那么就是 f(10)---> consloe.log(10+(++7))? // 则为 18
console.log(x)为什么是5呢 因为 f(7)还是f(10)执行时候找x都是从自己本身往外找一直找到window,因为他执行上下文中有x所以 他修改的是 执行上下文的x,跟全局中的x毫无关系,所以打印时候 x还是5

?

再来解释一道题
?

let a=0,b=0;
function A(x){
A=function(b){
???????alart(a+ b++)};
alart(a++)   //1
}
A(1)

还是之前说到的先计算还是先执行的? ,那么我拓展一下 我把函数修改一下????????

let a=0,b=0;
function A(a){
console.log(A)
A=function(b){
???????alart(a+ b++)};
alart(a++)
}
A(1)
A(1)
console.log(a)
console.log(b)

?

?这个怎么理解呢? console.log(A)//结果就是function A(x).......是本身这个函数,还是从里往外找,那么就有人说了 那函数体内不是有一个A=function(b){alart(a+ b++)} 这么理解 因为它函数体内的A并不是 var 申明的所以不存在变量提升,所以找到了window下的A所以会是这样的结果,
那么第一次执行函数A(1)alart(a++)//结果是1,此时此刻 window.A变了,A=function(b){alart(a+ b++)} 先是找A找到了全局的function A(x).......,完事修改成function(b){alart(a+....... 但是 第一次执行 A(1) 函数后 私有域中a=2,则第二次执行A(1)----->alart(2+1++)//3
???????全局中的a和b一毛钱关系都没有,它还是0

?

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-27 09:48:55  更:2021-11-27 09:49:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 20:39:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码