龙空技术网

JS变量、作用域和内存问题

前端小白说 324

前言:

现时各位老铁们对“js变量的作用域”大概比较注重,看官们都想要了解一些“js变量的作用域”的相关文章。那么小编在网上搜集了一些对于“js变量的作用域””的相关内容,希望咱们能喜欢,兄弟们一起来了解一下吧!

基本类型和引用类型的值

基本类型值指的是简单的数据段;

引用类型值指那些可能由多个值构成的对象。

不能给基本类型添加属性,可以给引用类型值动态的添加属性。

基本类型按值访问,存放在栈内存中。

引用类型按引用访问,存放在堆内存中,栈内存中存放的是它的地址。

复制引用类型,复制的是栈内存中的地址,所以改变一个变量会影响另一个变量。

不管是栈内存还是堆内存,复制的都是栈内存中的地址。

传递参数

所有的函数参数都是按值传递的。

function setName(obj){ //这里将要传递一个引用类型的参数,但不是按引用传递,是按值传递 obj.name = "lee";}var person = new Object();//setName(person);alert(person.name); //打印lee//js没有按引用传参的功能,切记不能把传递引用参数当作按引用传参

传参是局部变量

var box = "Lee";function setBox = { //通过传参也是局部变量,作用域在setBox()范围下 alert(box); //打印"red"}setBox("red");alert(box); //打印"Lee"

检测类型

typeof只能检测基本数据类型

instanceof能检测引用类型的值

语法:

result = variable instanceof constructor

使用时构造函数首字母需要大写;

变量和引用类型的值对应返回true,否则返回false。

instanceof在检测基本类型时,始终返回false.

作用域

全局环境被认为是window对象

作用域链

作用域链的用途是保证对执行环境的有权访问的所有变量和函数的有序访问。

在同一作用域中可以互相访问;在不同作用域中,全局环境不能访问局部变量,在局部环境中可以访问全局变量。

作用域链例子:

var box = "Lee";function setBox(){ function setColor(){ //setColor()方法作用域在setBox()内 var b = "kkk"; //b的作用域在setColor()内 alert(b); //打印kkk return 123; //返回123 } return setColor(); //调用setColor(),返回123}alert(setBox()); //调用setBox(),打印123

没有块级作用域

if和for语句的花括号没有作用域的功能。

使用var声明的变量会动被添加到最近的环境中;

查询标识符,现在作用域链的最前端开始搜索,逐步向上级查询,直到找到匹配的标识符,

在变量查询中,访问局部变量要比全局变量更快,因为不需要向上搜索作用域。

垃圾收集

垃圾收集器会在运行的时候给存储在内容中的变量加上标记,然后去掉环境中正在使用变量的标记,没有被去掉标记的标量将被视为准备删除的变量。

标签: #js变量的作用域