js 函数作用域

像c c++ c#的作用域是语句块,以{}大括号来区分的,而python和js是以函数来区分作用域的。

如:

================================ 1. 以函数作为作用域 (let除外)================================

        其他语言: 以代码块作为作用域
                    public void Func(){
                        if(1==1){
                            string name = 'Java';
                            
                        }
                        console.writeline(name);
                        
                    }
                    Func()
                    // 报错
                    
        Python:   以函数作为作用域
                    情况一:
                        def func():
                            if 1==1:
                                name = 'alex'
                            print(name)
                            
                        func()
                        // 成功
                    情况二:
                        def func():
                            if 1==1:
                                name = 'alex'
                            print(name)
                            
                        func()
                        print(name)
                        // 报错
                
        JavaScript:  以函数作为作用域
        
                    function func(){
                        if(1==1){
                            var name = 'alex';
                        }
                        console.log(name);
                    }
                    func()

  


================================ 2. 函数的作用域在函数未被调用之前,已经创建,即申明定义函数时创建作用范围 ================================

        function func(){
            if(1==1){
                var name = 'alex';
            }
            console.log(name);
        }

  

================= 3. 函数的作用域存在作用域链,并且也是在被调用之前创建。即嵌套函数中,越内层函数的变量越优先,依次向外层找,全局也找不到就报错 ==================

        示例一:
            xo = "alex";
            
            function func(){
                // var xo = 'eric';
                function inner(){
                    // var xo = 'tony';
                    console.log(xo);
                }
                
                inner()
            }
            
            func()
        
        示例二:
            xo = "alex";
            
            function func(){
                var xo = 'eric';
                function inner(){
                    
                    console.log(xo);
                }
                
                return inner;
            }
            
            var ret = func()
            ret()
        
        
        
        示例三:
            xo = "alex";
            
            function func(){
                var xo = 'eric';
                function inner(){
                    
                    console.log(xo);
                }
                var xo = 'tony';
                
                return inner;
            }
            
            var ret = func()
            ret()

  

================= 4. 函数内局部变量 声明提前,但不赋值 ==================

function func(){
            console.log(xxoo);
        }
        
        func();
        // 程序直接报错
        
        function func(){
            console.log(xxoo);
            var xxoo = 'alex';
        }
        函数从上到下解释时,遇到函数定义,会先把里面所有局部变量先定义一下,但不赋值。
        
        func();
        // undefined

  

原文地址:https://www.cnblogs.com/alex-hrg/p/9446282.html