Javascript变量

一、变量

                  基本类型                        引用类型          
不可修改 可以修改
保存在栈内存中 保存在堆内存中
按值访问 按引用访问
比较时,值相等即相等 比较时,同一引用才相等
复制时,创建一个副本 复制的其实是指针
按值传递参数 按值传递参数
用typeof检测类型 用instanceof检验类型

   基本类型复制时,创建一个副本,对副本的操作与原来的值不相干的,引用类型的复制其实是指针,这样子新的变量指向的就是同一个东西了,这样子你对某一个变量进行操作,其实是会影响另一个变量的。

二、作用域

  1. 作用域有全局作用域和局部作用域之分。

  2. 作用域链是用来查询变量的(由内往外)

  3. JS解析机制

      a.预解析

      b.逐行解析

(1)把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值。

(2)把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用。

(3)先提升 var,在提升 function

     因此我们定义函数时,绝大数使用第一种方式(函数声明的方式)

     当匿名函数多于定时器里面和注册事件的时候,比如:

     <script>

            btn.onclik = function(){

                  console.log("这是一个匿名函数”);

            }

     </script>

     2.预解析示例:

     <script>

             var num = 789;

             function fn(){

                   console.log(num);

                   var num = 789;

             }

             fn();

     </script>

      此时控制台打印的是undefined,原因是:JS解析代码时,把函数的声明还有变量的声明提升到当前作用域的最前面,所以代码就变成:

      <script>

             var num;

             num = 789;

             function fn(){

                  var num;

                  console.log(num);

                  num = 789;

             }

            fn();

      </script>

三、自执行函数

       (1)第一种写法

               <script>

                    (function(){

                          console.log("这是一个自执行函数");

                     })();

               </script>

              这样写的原理是:由函数表达式演变过来的,var fn = function(){}fn(); 把fn替换为:function(){},就成了:function(){}(); 为了保持整体性,在function加上一个(),所以就变成了(function([这里是形参]){}) ([这里是实参])

             (2)第二种写法

、              <script>

                       (function(){

                              console.log("这是一个自执行函数");

                       }());

                 </script>

四、闭包

       对于闭包,当外部函数返回之后,内部函数依然可以访问外部函数的变量。

       function f1(){

             var N = 0; 

             function f2(){

                   N += 1;

                   console.log(N);

             }

             return f2;

       }

      var result = f1();

      result();

      result();

      result();

原文地址:https://www.cnblogs.com/Qxian/p/10781083.html