好了,还是根据相应的题来说
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 ?
|