细品JS(ECMAScript)作用域

作用域

变量名作用的范围

分类

JavaScript由ECMAScript和DOM、BOM三者组成。

JS中作用域有:全局作用域、函数作用域。没有块作用域的概念。

ES6新增块级作用域

补充:块作用域

块作用域由 { } 包括,if语句和for语句里面的{ }也属于块作用域。

1. var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问。
2. let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。
3. const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改。
4. 同一个变量只能使用一种方式声明,不然会报错


全局作用域

作用于js起作用的部分

声明 全局作用域下var声明

特殊情况下,函数内不用var声明的

浏览器关闭才销毁

局部作用域

作用于所在函数内

声明 函数内部var声明的

函数使用时初始化,函数运行结束时销毁

内部作用域链

内部函数可以访问外部变量=》链式查找决定哪些数据能被内部访问,称 作用域链

总结

一个作用域可以使用并影响外层作用域中的变量,不可以使用里层作用域的变量

!!!传参时,如数组、对象这类变量实际指向内容的存储地址的(而非内容的),全局复杂变量在函数中改变变量值会影响在全局的值。而string ,number,boolean,undefined,null不能。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>作用域</title>
</head>
<body>
<script type="text/javascript">
    console.log("作用域---------------------");
    var a=5;
    console.log("全局定义"+a);
    change();
    console.log("局部修改后全局访问"+a);
    function change(){
        console.log("局部访问"+a);
        a=4;
        console.log("局部修改为"+a);
    }
    console.log("总结:一个作用域可以使用并影响外层作用域中的变量,不可以使用里层作用域的变量\n\n\n");
    console.log("传参-------------------------");
    var b=5;
    console.log("全局定义"+b+'实参为b形参为c');
    changeP(b);
    console.log("通过传参,局部修改后,全局访问"+b);
    function changeP(c){
        console.log("局部访问"+c);
        c=4;
        console.log("局部修改为"+c);
        console.log("b此时为"+b);
    }
    console.log("string-----------------------");
    var b="string";
    console.log("全局定义"+b+'实参为b形参为c');
    changePs(b);
    console.log("通过传参,局部修改后,全局访问"+b);
    function changePs(c){
        console.log("局部访问"+c);
        c[1]='o';
        console.log("局部修改为"+c);
        c='os';
        console.log("局部修改为"+c);
        console.log("b此时为"+b);
    }
    console.log("null------------------------");
    var b=null;
    console.log("全局定义"+b+'实参为b形参为c');
    changePn(b);
    console.log("通过传参,局部修改后,全局访问"+b);
    function changePn(c){;
        c={m:'os',t:'bb'};
        console.log("局部修改为"+c);
        console.log("b此时为"+b);
    }
    console.log("undefined-------------------------");
    var b=undefined;
    console.log("全局定义"+b+'实参为b形参为c');
    changePu(b);
    console.log("通过传参,局部修改后,全局访问"+b);
    function changePu(c){;
        c='os';
        console.log("局部修改为"+c);
        console.log("b此时为"+b);
    }
    console.log("boolean-------------------------");
    var b=true;
    console.log("全局定义"+b+'实参为b形参为c');
    changePb(b);
    console.log("通过传参,局部修改后,全局访问"+b);
    function changePb(c){;
        c=false;
        console.log("局部修改为"+c);
        console.log("b此时为"+b);
    }
    console.log("数组-------------------------");
    var d=new Array();
    console.log("全局定义d"+d+'实参为b形参为c');
    d[0]="hello";
    console.log("全局定义d"+d+'实参为b形参为c');
    changePa(d);
    console.log("通过传参,局部修改后,全局访问"+d);
    function changePa(c){;
       c[0]="1";
        console.log("局部修改为"+c);
        console.log("b此时为"+d);
    }
    console.log("对象-------------------------");
    var d=new Object();
    console.log("全局定义d"+d+'实参为b形参为c');
    d[0]="hello";
    console.log("全局定义d[0]"+d[0]+'实参为b形参为c');
    changePa(d);
    console.log("通过传参,局部修改后,全局访问"+d[0]);
    function changePa(c){
        c[0]="1";
        console.log("局部修改为"+c[0]);
        console.log("b此时为"+d[0]);
    }
    console.log("总结:!!!传参时,如数组、对象这类变量实际指向内容的存储地址的(而非内容的),全局复杂变量在函数中改变变量值会影响在全局的值。而string ,number,boolean,undefined,null不能。\n\n\n");
</script>
</body>
</html>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值