微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JS作用域和闭包核心面试题分析

作用域和闭包-执行上下文:

变量提升(写代码时千万不要先使用再定义)

    <script>
        console.log(a);//undefined
        var a=10;

        fn('cyy,18);
        function fn(name,age){
            age20;
            console.log(name,age);cyy 20
             age;
        }
    </>

 

函数声明存在提升,函数表达式不存在提升

    
        fn1();函数声明  不会报错
         fn1(){}

        fn2();函数表达式  报错
         fn2(){}
    >

 

    
        fn( fn(name){
            console.log(this);
            console.log(arguments);
            console.log(name);
        }
    >

 

 

作用域和闭包-this:

this要在执行时才能确认值,定义时无法确认

    >
        {
            name:.name);
            }
        }
        a.fn();this===a
        a.fn.call({name:cyy2});this==={name:'cyy2'}
         fn1a.fn;
        fn1();this===window
    >

 

this:

作为构造函数执行

作为对象属性执行

作为普通函数执行

call  apply  bind

    构造函数
         Foo(name){
            .namename;
        }
         fnew Foo();

        作为一个对象的属性
         obj.name);
            }
        }
        obj.fn();

        普通函数的this
         fn(){
            console.log();
        }
        fn();this===window

        call  apply  bind
         fn1(name,age){
            console.log(name);
            console.log();
        }
        fn1.call({x:},1)">);
        fn1.apply({x:cyy319]);

        (name,1)">);
        }.bind({x:30});
        fn2(cyy4);
    >

 

 

作用域和闭包-作用域:

没有块级作用域,只有函数和全局作用域

    无块级作用域
        if(true){
             name;
        }
        console.log(name);

        有全局和函数作用域
        ;
         fn(){
            ;
            console.log(fn:+a);
        }
        fn();
        console.log(global:a);
    >

 

 

    作用域链
         b;
            当前函数作用域内没有定义的变量,即自由变量
            console.log(a);
            console.log(b);
        }
        fn();
    >

 

 

作用域和闭包--闭包:

闭包的使用场景:

1、函数作为返回值

2、函数作为参数传递

    函数作为返回值
         F1(){
            100return (){
                console.log(a);a是自由变量,向父级作用域去寻找---函数定义时的作用域
            }
        }
         f1F1();
        200;
        f1();100

        函数作为参数传递
         F2(){
            (){
                console.log(b);b是自由变量,向父级作用域去寻找---函数定义时的作用域
 f2F2();
         F3(fn){
            300;
            fn();
        }
        F3(f2);100
    >

 

作用域和闭包--解题:

    错误的写法
        点击结果都是10
         i;
        for(i0;i<++document.createElement(a);
            a.innerHTMLi;
            a.addEventListener(click(e){
                e.preventDefault();
                alert(i);i是自由变量,要去父作用域寻找值;for循环不是作用域,所以获取到的i是循环结束的全局变量i=10
            })
            document.body.appendChild(a);
        }


        正确写法,自执行的匿名函数形成函数作用域
        ){
            ((i){
                形成函数作用域,i不再是全局变量
                );
                a.innerHTMLi;
                a.addEventListener((e){
                    e.preventDefault();
                    alert(i);i是自由变量,要去父作用域寻找值
                })
                document.body.appendChild(a);                
            })(i);
        }
    闭包的应用
         isFirstLoad(){
             _list[];通常_开头的变量表示私有
            (id){
                (_list.indexOf(id) >= ){不是第一次出现
                    false;
                }else{
                    _list.push(id);
                    ;
                }
            }
        }
         firstloadisFirstLoad();
        console.log(firstload());true
        console.log(firstload(false
true
    >

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐