JS作用域

JS作用域相关知识点归纳总结

JS作用域相关理论基础:

作用域:
域:空间、范围、区域……
作用:读、写

script:自上而下  全局变量、全局函数   
函数:由里到外 

浏览器:
“JS解析器”
    1)“找一些东西”: var  function  参数

        a = undefine
        所有的变量,在正式运行代码之前,都提前赋了一个值:未定义
        fn1 = function fn1(){ alert(2); }
        所有的函数,在正式运行代码之前,都是整个函数块

    JS 的预解析原则:
        遇到重名的:只留一个
        变量和函数重名了,就只留下函数

    2)逐行解读代码:
        表达式:= + - * / % ++ -- ! 参数……        
        注意:表达式可以修改预解析的值!

注意:函数块不要放在if/elsefor{}里面执行    

案例分析:

<script>
    alert(a);                   // function a (){ alert(4); }
    var a = 1;
    alert(a);                   // 1
    function a (){ alert(2); }
    alert(a);                   // 1
    var a = 3;
    alert(a);                   // 3
    function a (){ alert(4); }
    alert(a);                   // 3

    alert( typeof a );         //number
    a();                       // 报错
</script>

4段相似的代码 (对比分析):

<script>
    var a = 1;
    function fn1(){
        alert(a);               // undefined
        var a = 2;
    }
    fn1();
    alert(a);                   // 1
</script>
局部可以修改全局
<script>
    var a = 1;
    function fn1(){
        alert(a);               // 1
        a = 2;          
    }
    fn1();
    alert(a);                   // 2   全局变量被修改
</script>
有参数,未传参,参数相当于 var a ;
<script>
    var a = 1;
    function fn1(a){
        alert(a);                       // undefined
        a = 2;
    }
    fn1();
    alert(a);                           // 1
</script>
有参数,且传参,参数相当于 var a =1 ;
<script>
    var a = 1;
    function fn1(a){
        alert(a);                       // 1
        a = 2;
    }
    fn1(a);
    alert(a);                           // 1
</script>

获取函数内的值:

函数内的值在全局获取
<script>
    var str = '';
    function fn1(){
        var a = '我在这儿...';
        str = a;
    }
    fn1();
    alert( str );               //  "我在这儿..."
</script>
函数内的值在另一个函数获取
<script>
    function fn2(){
        var a = '我在这儿...';
        fn3(a);
    }
    fn2();

    function fn3(a){
        alert(a);              //  "我在这儿..."  
    }
</script>

常见的实际案例问题:将ver改为let

<input type="button" value="按钮1" />
<input type="button" value="按钮2" />
<input type="button" value="按钮3" />

<script>
    window.onload = function (){
        var aBtn = document.getElementsByTagName('input');
        for( var i=0; i<aBtn.length; i++ ){
            aBtn[i].onclick = function (){
                alert( i );         // 只能弹出3
            };
        }
    };
</script>
<input type="button" value="按钮1" />
<input type="button" value="按钮2" />
<input type="button" value="按钮3" />

<script>
    window.onload = function (){
        var aBtn = document.getElementsByTagName('input');
        for( let i=0; i<aBtn.length; i++ ){
            aBtn[i].onclick = function (){
                alert( i );         // 分别弹出0,1,2(执行正确)
            };
        }
    };
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值