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 是全局下的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

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值