您现在的位置: 万盛学电脑网 >> 程序编程 >> 脚本专题 >> javascript >> 正文

js变量、作用域及内存详解

作者:佚名    责任编辑:admin    更新时间:2022-06-22

 基本类型值有:undefined,NUll,Boolean,Number和String,这些类型分别在内存中占有固定的大小空间,他们的值保存在栈空间,我们通过按值来访问的。

(1)值类型:数值、布尔值、null、undefined。
(2)引用类型:对象、数组、函数。

如果赋值的是引用类型的值,则必须在堆内存中为这个值分配空间。由于这种值的大小不固定(对象有很多属性和方法),因此不能把他们保存到栈内存中。但内存地址大小是固定的,因此可以将内存地址保存在栈内存中。

1 2 3 4 5 6 <script type="text/javascript”> var box = new Object(); //创建一个引用类型 var box = "lee";  //基本类型值是字符串 box.age = 23;  //基本类型值添加属性很怪异,因为只有对象才可以添加属性。 alert(box.age); //不是引用类型,无法输出; </script>

简而言之,堆内存存放引用值,栈内存存放固定类型值。

js变量、作用域及内存详解 三联

1 2 3 4 5 6 7 8 <script type="text/javascript">   var man = new Object();//man指向了栈内存的空间地址   man.name = "Jack";   var man2 = man;//man2获得了man的指向地址      alert(man2.name);//两个都弹出Jack   alert(man.name); </script>

复制变量值

再看下面这个例子:

1 2 3 4 5 6 7 8 9 <script type="text/javascript">   var man = new Object();//man指向了栈内存的空间地址   man.name = "Jack";   var man2 = man;//man2获得了man的指向地址      man2.name = "ming";//因为他们都指向同一个object,同一个name,不管修改谁,大家都修改了   alert(man2.name);//两个都弹出ming   alert(man.name); </script>

由以上可以得出:在变量复制方面,基本类型和引用类型也有所不同,基本类型复制的是值本身,而引用类型复制的是地址。

传递参数

ECMAScript中,所有函数的参数都是按值传递的,

1 2 3 4 5 6 7 8 9 10 11 <script type="text/javascript">    function box(num){   //按值传递      num+=10;      return num;    }       var num = 10;    var result = box(num);    alert(result); //如果是按引用传递,那么函数里的num会成为类似全局变量,把外面的number替换掉    alert(num);  //也就是说,最后应该输出20(这里输出10) </script>

javascript没有按引用传递的,如果存在引用传递的话,那么函数内的变量将是全局变量,在外部也可以访问。但这明显是不可能的。

执行环境及作用域

执行环境是javascript中最为重要的概念之一,执行环境定义了变量或函数有权访问其他数据。

全局执行环境是最外围的执行环境,在web浏览器中,全局执行环境是window对象,因此,所有的全局变量的函数都是作为window的属性和方法创建的。

1 2 3 4 5 6 7 8 9 <script type="text/javascript">    var name = "Jack";      //定义全局变量    function setName(){      return "trigkit4";    }       alert(window.name);    //全局变量,最外围,属于window属性    alert(window.setName()); //全局函数,最外围,属于window方法 </script>

当执行环境内的代码执行完毕后,该环境被销毁,保存其中的变量和函数也随之销毁,如果是全局环境,需所有程序执行完毕或网页完毕后才会销毁。

去掉var的局部变量

1 2 3 4 5 6 7 8 9 <script type="text/javascript">    var name = "Jack";    function setName(){      name = "trigkit4";  //去掉var变成了全局变量    }       setName();    alert(name);//弹出trigkit4 </script>

通过传参,也是局部变量

1 2 3 4 5 6 7 8 9 <script type="text/javascript">    var name = "Jack";    function setName(name){  //通过传参,也是局部变量      alert(name);    }       setName("trigkit4");//弹出trigkit4    alert(name);//弹出Jack </script>

函数体内还包含函数,只有这个函数才可以访问内一层的函数

1 2 3 4 5 6 7 8 9 <script type="text/javascript">    var name = "Jack";    function setName(){      function setYear(){  //setYear()方法的作用域在setName()内        return 21;      }    }    alert(setYear());//无法访问,出错  </script>

可以通过如下方法进行访问:

1 2 3 4 5 6 7 8 9 10 <script type="text/javascript">