关于作用域

87 阅读1分钟
<script>
    /* 
    作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期
变量的作用域有两种
全局作用域
局部作用域

最外层函数和在最外层函数外面定义的变量拥有全局作用域

所有window对象的属性拥有全局作用域
window对象的内置属性都拥有全局作用域,例如window.name、window.location、window.top等等


*/
    /* 页面一加载script标签的时候会预解析 */
    /* 第一件事 就是把function拿到最前面来解读 */
    /* 第二件事 是var定义的变量(不是let定义的变量) 提前赋值为undefined */
    /* 函数是一等公民  */
    // function fn() {
    //     let jubu = '局部变量';
    //     function fnn() {
    //         allchild = '看我是全局还是局部呢?'
    //         window.console.log('fnn');
           
    //     }
    //     fnn();
    // }
    // let all = '全局变量';
    // fn();

    // console.log(allchild);

    /* function fn1(){
        fnn();
    }
    fn1(); */

    /*
    定义全局函数,挂载到window对象下面 
        window.consoleFn = function(){
            alert('fn')
        }
    */

    /* 和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到
*/

/* 可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链
*/
/* 在这个函数中,作用域链式从内到外一层一层的去寻找all这个变量,谁最先找到就返回谁的值 */
        let all = '123';
        function fn1(){
            /* all='789' */
            function fn2(){
               /*  all='456' */
                alert(all)
            }
            fn2();
        }
        fn1();
</script>