预解释继续。。。。。

var i = 2,
    x = 5;
var fn = function (x) {
    x += 3;
    return function (y) {
        console.log((x++) + y + (--i));
    }
};
var f = fn(1);
f(2);
fn(3)(4);
f(5);

  2.当function f1(){return function f2(){}}这类一种函数存在于另一个函数作用域中,当调用f2时,f2的执行依赖于f1的执行,此时f1不立即销毁,等f2执行完成后会销毁。

  1. fn(3)(4)执行重新开辟了一个堆内存(私有作用域),形参赋值。x 为3,y 为4。因为上一次的运算使全局作用域的 i 赋值为1. 所以自上而下执行后此时(x++)+y+(--i)运算结果为10;运算后全局作用域下的变量 i 赋值为0;

此题做稍微的变化:

  1. var f = fn(1);相当于开了一个堆内存(私有作用域),形参赋值。自上而下执行,x赋值为4;

  2. f(2)执行给return function(y)形参赋值,function(y)开辟一个堆内存,x 在自身作用域没有赋值通过作用域链找上级 x 赋值为4,i 同样通过作用域链找到全局作用域

我相信大家对预解释都很熟悉,从下题开始浅显的进行预解释,旨在对题的关键点做更细微的诠释,

解题思路:

- 内存包含:堆内存和栈内存
- 堆内存:用来存放数据的;
    + 对象数据类型的
        + 存的是键值对 key=value;
    + 函数数据类型的
        + 代码字符串
- 堆内存的释放:
    var a=[1,2,3,4]     释放:a=null;
- 栈内存:本身提供了一个供JS代码执行的环境
    + 包含:全局作用域 和 私有作用域
- 全局作用域的形成和销毁:
    + 形成:当一个页面被浏览器加载完成的时候,全局作用域就形成了;
    + 销毁:1)关闭页面 2)关闭浏览器
- 私有作用域的形成和销毁:
    + 形成:当函数被调用的时候,会形成私有作用域
    + 销毁:一般情况下,但函数执行完成的时候,默认就被销毁了;但是两种情况下不销毁:
       + 不销毁:当函数体内的东西被外面的变量或者其他占用的话,就不销毁;
       + 不立即销毁:当函数执行完成的时候,会返回一个函数,被返回的函数还需要再执行一次;只有所有的调用都完成的时候,这个函数才能销毁;        

  

本人做题总结出此类题的小技巧:

4.f(5)执行同f(2)一样形参赋值,但是要注意的是经过自上而下的运算后此时的 x 赋值为5,i 赋值为0;(x++)+y+(--i)运算结果为9;运算后此时的 x 形参赋值为6,全局作用域下的变量 i 为负1(-1)。

解析:这道题的思路与上题类似,有一个点需要注意就是函数内部如果有私有变量那么他就不会去别的父级作用域上取值,所以此题中i的值是以私有变量i值为基准:

    

就相当于function(3){
        console.log(3*(++i))
    }

答案:f(2) => 7;     fn(3)(4) => 10;    f(5) =>9;

 

    下的 i 赋值为2;运算(x++)+y+(--i)结果为7   运算后此时的 x 形参赋值为5,全局作用域下的变量 i 为1。

f(3):

5.附一张详细解题配图!!!!图片 1

例2:引申

解析:1.解题思路:做此类题时,我的做法是先不考虑什么预解释,先通篇看一下在全局变量中是否有函数被全局变量占据,此题var f=fn();fn函数被全局变量f占据,所以类似于执行f()执行时,函数fn永远不会释放,里面i的值依然依次利用。但fn()(),恰好相反,执行依次释放依次,每次调用彼此之间互不影响。此上我觉得应该才是考点。

弄明白原理后,我们来根据实例具体阐述:

 

 

 

这一步我们注意到,没有了全局变量占据着的函数,所以第二步函数已经释放了,来吧从新执行吧,fn() i*=2=16*2=32;fn()(3) 3*(32+1)=3*33=99 ,此时全局变量i的值为33;

 

 1 <script>
 2     var i=3;
 3     function fn(){
 4         i*=2;
 5         return function(n){
 6             console.log(n*(++i))
 7         }
 8     }
 9     var f=fn();
10     f(3)
11     fn()(3);
12     f(4);
13     fn()(3);
14 </script>

fn()(3):

 

本文由金沙官网线上发布于Web前端,转载请注明出处:预解释继续。。。。。

您可能还会对下面的文章感兴趣: