2019-10-16

作者: 宇融大牛 | 来源:发表于2019-10-16 13:35 被阅读0次

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


    1、基本类型和引用类型的值

    * 基本类型 : 指的是简单的数据段,五种基本类型是按值访问的,可以直接操作保存在变量中实际的值。* 引用类型 : 指那些可能由多个值组成的对象,引用类型的值是保存在内存中的对象,js不允许直接访问内存中的位置,也就是不可直接操作对象的内存空间。

    操作对象实际是操作对象的引用而不是实际的对象,引用类型的值按引用访问。

    2、动态的属性

    引用类型的值可以添加属性和方法,也可以删除和修改,但基本类型不行。

    //引用类型

    varperson =newObject();person.name ="sheyurong";alert(person.name);//sheyurong

    基本类型添加属性也不会报错。

    //基本类型

    varname ="sheyurong"name.age =27;alert(name.age) ;//undefined

    3、赋值变量值

    //基本类型

    varnum1 =5;varnum2 = num1;// num1 与 num2 中的5完全独立,参与任何操作也不会相互影响

    //引用类型

    varobj1 =newObject();varobj2 = obj1;obj1.name ="syr";alert(obj.name);//"syr";改变其中任一变量也会影响另一个,因为两个变量引用同一变量。

    4、传递参数

    es中所有函数的参数都是按值传递的,基本类型与引用类型的传参与变量的复制一样。

    functionsetName(obj){    obj.name ="syr";    obj =newObject();    obj.name ="abc"}varperson =newObject();setName(person);alert(person);// "syr"//可以把函数的传参想象成局部变量一样

    5、检测类型

    typeof可以检测基本类型,但检测对象时并不能知道是什么类型的对象,因此,使用instanceof操作符。

    语法 :

    result = variable instanceof constructor

    //如果变量为引用类型的实例,则instanceof返回true

    例 : person instanceof Object; // person是Object的实例吗?

    根据规定,所有引用类型都是object的实例,instanceof检测基本类型,适中返回false,因为基本类型不是对象。

    6、执行环境及作用域

    * 执行环境决定了变量或函数有权访问的其他数据,决定了她们各自的行为。* 每个执行环境都有一个环境变量对象,所有变量和函数都保存在这里面,无法访问,但是后台会使用它。* 全局变量是最外围的一个执行环境,代码在环境中执行,会创建一个作用域链,用途是保证对执行环境有权访问所有变量和函数的有序访问。* 作用域链 : 如环境是函数,则最开始只包含有一个变量-arguments对象 -> 外部环境1 -> 外部环境2 ... -> 全局。

    作用域链中最后一个对象始终是全局执行环境。

    * 内部环境可以通过作用域链访问所有的外部环境,外部则不能访问内部。函数参数的访问规则与执行环境其他变量相同。

    7、延长作用域链

    * 使用try-catch语句的catch块;*with语句 :

    都是会在作用域链的前端添加一个变量对象,with可将制定对象添加到作用域链中。

    catch创建新变量,内涵跑出的错误对象声明。

    例 :functionbuild(){varqs ='aaa';with(location){varurl = href + qs;        }returnurl ;}//with吧location对象引入,此种就包含了location中所有属性和方法。

    相关文章

      网友评论

        本文标题:2019-10-16

        本文链接:https://www.haomeiwen.com/subject/ojaymctx.html