zf-fe

06-闭包作业复习1

2020年5月23日

★作业

1)题一

let x = 5;
function fn(x) {
    return function(y) {
        console.log(y + (++x));
    }
}
let f = fn(6);
f(7);
fn(8)(9);
f(10);
console.log(x);

分析:

1、EC(G)

  1. ECStack
    1. VO
      1. x -> 5
      2. fn -> 0x101
        1. 代码字符串+键值对
        2. init [[scope]] -> VO(G)
      3. f
        1. fn(6)执行

2、EC(fn)

  1. fn(6)
    1. init [[scopeChain]] -> VO(G)
    2. init AO
      1. arguments -> {0:6}
      2. x -> 6
      3. 代码执行
        1. 返回 0x102

3、EC

  1. f(7) -> scopeChain AO(fn) -> 7+6+1 = 14 -> AO(fn)(x=7)
  2. fn(8)(9) -> 9+8+1 = 18 -> AO(fn)(x=9)
  3. f(10) -> 10+7+1 = 18
  4. console.log(x) -> 5

4、结果:

14、18、18、5

测试运行情况:正确

个人认为考察点:

2)题二

let x = 5;
function fn() {
    return function(y) {
        console.log(y + (++x));
    }
}
let f = fn(6);
f(7);
fn(8)(9);
f(10);
console.log(x);

分析:

1、EC(G)

2、EC(fn)

3、结果

13、16、18、8

测试正确

个人认为考察点:

3)题三

let a=0,
    b=0;
function A(a){
    A=function(b){
        alert(a+b++);
    };
    alert(a++);
}
A(1);
A(2);

分析:

1、EC(G)

2、EC(A)

3、EC(A)

4、结果

1、4

测试正确

归纳一下自己如何分析:

  1. 直接看EC(G)EC(函数)
  2. 只写变量的状态以及变量状态变化过程 -> 只分析VO/AO
  3. 涉及到函数,就用 0x1010x102这样的过程
  4. 作用域和作用域链不需要分析,潜意识就应该有了吧

我发现做了几道题后,不会写代码了,只会看这些代码……

3)题四

var x = 3,
    obj = {x: 5};
obj.fn = (function () {
    this.x *= ++x;
    return function (y) {
        this.x *= (++x)+y;
        console.log(x);
    }
})();
var fn = obj.fn;
obj.fn(6);
fn(4);
console.log(obj.x, x);

分析:

1、EC(G)

2、EC(fn)

3、EC(0xF101)

4、EC(0xF101)

5、结果

  1. 13
  2. 234
  3. 95,234

测试答案正确

在计算的时候,注意成员访问(即.)的level是19,以及 A += B + CA *= B + C 都是 A = A+(B+C)A = A*(B+C)


★老师的讲解

◇我没有留意到的细节点

◇题目讲解

1、题一

题一部分1

题一部分2

2、题二

题二

★总结

★Q&A

1)`++x` 与 `x++` 区别?

同学别费劲了,不同的编译器处理结果不同,谁在实际项目中这样写我要对他竖中指

翻译成代码:

x++

var t = x
x = x+1
return t

++x
return (x = x+1)

➹:++x和x++到底有什么区别? - 知乎

➹:为什么在 C 语言中,i=1;i=(++i)+(++i)+(++i)+(++i); 得到 i 的结果是 15 而不是 14 ? - 知乎