js的学习之路

js的学习之路,第1张

作用域:

var 关键字
            var fn=; fn就是标识符
            作用域:标识符(变量和函数)在什么地方能被访问
            规则:1,函数内部的代码可以访问函数内部的标识符,也可以访问函数外部的标识符
                     2,函数外部可以访问函数外部的标识符,但不能访问函数内部的标识符
            案例
            function fn(a){
                function fm(a){
                    console.log(a)
                    a=90
                    console.log(a)
                }
                fm(a)//fm(200)
            }
            var a=200;
            fn(a)//fn(200)
            console.log(a)

            案例
                function fn(a) {
                    // var a =90/200
                    function fm() {
                        console.log(a)
                        a = 90
                        console.log(a)
                    }
                    fm(a) //fm(200)
                    console.log(a) //90 上面调用fm,a被改成90
                }
                var a = 200;
                fn(a) //fn(200)
                console.log(a)

            //案例 函数内部的 *** 作可以改变外部的变量
            var total = 0;
            function increment(){                
                var total=2//里面有就不改外面的
                total=total+2                
            }
            function decrease(){
                total=total-2
            }
            
            increment()//两个作用域 互不影响 不会将上一次修改的total值用在下次调用
            increment()//两个作用域 互不影响
            decrease()
            console.log(total)

            案例
            var a=10
            function fn(){
                console.log(a)//undefined 隐式提升,var a,值不会上去 
                a=40//a 是上面声明的a
                var a=20
                console.log(a)//20
            }
            console.log(a)//10
            fn()
            console.log(a)//10

            总结:每一个作用域在运行时,js引擎会把js里面所有的var(变量预解析)还有function(函数预解析)提升到当前作用域的最前面。(var提升声明,不提升赋值,函数提升整体)

            案例
            function fn(a){
                fm=a//函数指向变为a
                function fm(){
                    console.log(123)
                }//隐式提升
                console.log(fm)//这里的fm已经指向了a
            }
            var a= function(){
                console.log(124)
            }
            fn(a)


            function fn() {
                var a = 90

                function fm() {
                    console.log(a)
                }
                return fm
            }
            var a = 100
            fn()()
            //函数是一个引用数据,标识符可以在任何作用域去引用一个函数但是函数还是运行在函数生成(定义和声明)时所在的作用域


            function fn(a){
                function fm(){
                    a=a+1
                    console.log(a)
                }
                return fm
            }
            fn()
            var f1 =fn(10)
            f1()//11
            f1()//12
            只调了1次fn,所以f1和f2都是在一个fn的作用域里面,而var a=10是在fn作用域上执行的,所有两次调用结果不一样

            function fn(a){
                function fm(){
                    a=a+1
                    console.log(a)
                }
                return fm
            }
            fn()
            var f1 =fn(10)
            f1()//11
            var f2 =fn(10)
            f2()//11
            调了两次fn,生成了两个fn的,所以f1和f2是在两个不同的作用域

同名标识符提升问题:         1.同名标识符提升问题:函数和变量同名,变量先提升,函数后提升


            console.log(a)
            var a =20
            function a(){
            console.log(123)
            }

          2. 同名标识符提升问题:变量和变量同名


            console.log(a)//undrfined
            var a=10
            console.log(a)//10
            var a=20
            console.log(a)//20

            3.同名标识符提升问题:函数和函数同名


            function a(){
            console.log(123)
            }
            function a(){
            console.log(122)
            }
            a()//122
            
            标识符三种写法
            var a = 20
            function fn(){}
            function fm(a){
                a=20
            }

            4.标识符的三种写法之间的提升问题(行(形参和变量)实函运)


            var a =20
            function fn(a){
                console.log(a,1)//函数
                a=90
                console.log(a,2)//90
                var a=100
                console.log(a,3)//100
                function a(){
                    console.log(666)
                }//提升到上面去了
                console.log(a,4)//100
            }
            fn()

            行(形参和变量)实函运:(面试不要这么说)
            在一个作用域运行时执行一下流程
            1.先隐式提升当前作用域的内部所有的形参变量和局部变量
            2.再把实参赋值给形参变量
            3.然后隐式提升函数
            4.再按顺序运行代码

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/925167.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-16
下一篇2022-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存