面试题一:

    1. function fun(n, o) {
    2. console.log(o);
    3. return {
    4. fun: function (m) {
    5. return fun(m, n)
    6. }
    7. }
    8. }
    9. var a = fun(0)
    10. a.fun(1)
    11. a.fun(2)
    12. a.fun(3)
    13. var b = fun(0).fun(1).fun(2).fun(3)
    14. var c = fun(0).fun(1)
    15. c.fun(2)
    16. c.fun(3)

    面试题二:
    链接:https://www.nowcoder.com/questionTerminal/ca2472f3581c467fb81a7a77b47ab740
    来源:牛客网
    //输出0 1 0
    function Foo() {
    ``var i = ``0``;
    ``return function() {
    ``console.log(i++);
    ``}
    }

    var f1 = Foo(),
    ``f2 = Foo();
    f1();
    f1();
    f2();
    这道题考察闭包引用类型对象的知识点:
    1.一般来说函数执行完后它的局部变量就会随着函数调用结束被销毁,但是此题foo函数返回了一个匿名函数的引用(即一个闭包),它可以访问到foo()被调用产生的环境,而局部变量i一直处在这个环境中,只要一个环境有可能被访问到,它就不会被销毁,所以说闭包有延续变量作用域的功能。这就好理解为什么:

    1
    2
    f1();``//0
    f1();``//1

    2.我一开始认为f1和f2都=foo()是都指向了同一个function引用类型,所以顺理成章就会答错认为:

    1 f2();``//2

    但其实foo()返回的是一个匿名函数,所以f1,f2相当于指向了两个不同的函数对象,所以结果也就顺理成章的变为:

    1 f2();``//0