zoukankan      html  css  js  c++  java
  • js作用域总结

    一、在ES5中,js 的作用域

          js作用域,只有全局作用域与函数作用域,没有块级作用域。

        1、全局作用域

      

    var a = 10;
    function aaa() {
    alert(a) }
    function bbb(){ var a=20; aaa() } bbb(); // 10

       a =10 是全局的  而a=20 是局部的

     2、变量的查找是就近原则,去寻找var定义的变量,当就近没有找到的时候就去查找外层。

       

    var a=10
    function aaa(){
         alert(a);
        var a=20
    }
     
    aaa();   // undefined,一是预解析,二是就近查找。

       

    var a = 10
     function aaa(){
       alert(a)
        a=20
    }
      aaa();  // 10

      这个虽然是就近原则,但是就近找var声明的变量,因为a= 20  没有var声明,只是修改了a 的值,所以到外面去找了,输出的是10。不过没错的是a=20后,a确实为20了,只不过alert的时候还没有执行到那~~

    var a = 10
     function aaa(){
        a=20
       alert(a)
    }
      aaa();  // 20

    3、全局作用域与函数作用域:

    var a=10
     function aaa(){
         bbb();
         alert(a);
        function bbb(){
           var a=20
      } 
    }
       aaa();  // 10

    4、当参数跟局部变量重名时,优先级是等同的。

           

    var a=10;
     function aaa(a){
        alert(a)
        var a= 20;
    }
     aaa(a)   // 10

       js 中传参时,基本类型传值,引用类型传引用。

     var a = 5;
     var b=a;
     b +=3
      alert(a); // 5
    
    
    var a = [1,2,3]
    var b=a;
    b = [1,2,3,4];
    alert(a); //[1,2,3]

    var a = [1,2,3] var b=a; b.push(4); alert(a); //[1,2,3,4]

    参数与变量一样也是有作用域:

    var a=10;
    function aaa(a){
       a +=3
    }
    aaa(a)
    alert(a) // 10




    var a=10;
    function aaa(a){
       a +=3
    alert(a)
    }
    aaa(a)
     // 13


    var a= [1,2,3]
      function aaa(a){
         a=[1,2,3,4]
    }
    aaa(a)
    alert(a)  // 1,2,3



    var a= [1,2,3]
      function aaa(a){
         a.push(4)
    }
    aaa(a)
    alert(a)  // 1,2,3,4
     

       二、es6 中,块级作用域

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

               1、块作用域,var的变量外部是可以访问的。

         

    {
        var a= 1;
         console.log(a)   // 1
    }
    
    console.log (a) // 1
    
    
    
    ( function A() {
         var b=2;
         console.log(b)  // 2
    }) ();
    
     console.log(b); //报错
    
    
    iftrue){
         var c=3
    }
    
    console.log(c) // 3

            2、 var 、 let 、 const 区别

                var定义的变量,没有块的概念,可以垮块访问,不能跨函数访问;

                let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问;

                const 用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改。

                

    <script type="text/javascript">
        // 块作用域
        {
            var a = 1;
            let b = 2;
            const c = 3;
            // c = 4; // 报错
            var aa;
            let bb;
            // const cc; // 报错
            console.log(a); // 1
            console.log(b); // 2
            console.log(c); // 3
            console.log(aa); // undefined
            console.log(bb); // undefined
        }
        console.log(a); // 1
        // console.log(b); // 报错
        // console.log(c); // 报错
    
        // 函数作用域
        (function A() {
            var d = 5;
            let e = 6;
            const f = 7;
            console.log(d); // 5
            console.log(e); // 6  (在同一个{ }中,也属于同一个块,可以正常访问到)
            console.log(f); // 7  (在同一个{ }中,也属于同一个块,可以正常访问到)
    
        })();
        // console.log(d); // 报错
        // console.log(e); // 报错
        // console.log(f); // 报错
    </script>
  • 相关阅读:
    mac上的终端bash命令(二)基础
    Android 开发笔记___drawable
    Android 开发笔记___图像按钮__imageButton
    Android 开发笔记___滚动视图__scroll view
    Android 开发笔记___textvieww__跑马灯效果
    Android 开发笔记___textview_聊天室效果
    Android 开发笔记___图像视图__简单截屏
    Android 开发笔记___图像视图
    javaScript学习笔记(一)js基础
    iview2+ 表单密码验证
  • 原文地址:https://www.cnblogs.com/leyan/p/9337201.html
Copyright © 2011-2022 走看看