浅谈javascript中的变量、执行环境和作用域

JavaScript诞生于1995年,当时的主要用途是处理一些输入验证操作,今天,javaScript已经演进为一门功能全面的编程语言,能够处理复杂的计算机交互,同时它也是jqueryajaxAngularjsionic等技术的基础。现结合对教材理论的思考及编程实践,对javascript的变量,执行环境和作用域问题论述一些自身的体会请同行前辈不吝批评指正。

JavaScript变量可以用来保存两种类型的值:基本类型值和引用类型值,与基本类型相比,引用类型增加了数据的维度,此外,在很多语言中,String类型以对象形式表示并被认为是引用类型,但javascript例外,string是值类型。这里可以提出一个问题,这两种类型的变量通常是在存储在栈上还是堆上呢?

EMCScript标准中没有对变量存储进行限定,仅仅是描述了行为,因此这个问题的答案并不唯一,不同的引擎可能有不同的实现。因为行为与存储方式是紧密相关的,因此我们可以根据它们的表现行为来推断是如何实现的,根据表现出的行为分析,我个人认为是创建在堆上的,相比于栈,对堆而言,数据项没有固定的顺序,可以以任意顺序插入和删除,因为javascript的变量是松散类型而且javascript是解释型语言,数据项存储在堆中有利于解释器的构建。  

基本类型在进行变量的复制操作时,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上,即基本类型的变量复制操作可以理解为“克隆”。引用类型在进行变量的复制操作时,复制的是一个指向被复制对象的指针,如果将基本类型在进行变量的复制操作比喻成“克隆”的话。引用类型在进行变量的复制操作就是“按照原有名片为某个人印刷一张新名片(当然,名片要上印着地址)”。复制操作结束后,被复制的变量和新变量将引用同一个对象,原有名片和新名片虽然是两个量,但代表的“实体”是一样的,都是指向同一个人。

Javascript的执行环境定义了变量或函数有权访问的其它数据,决定了它们各自的行为。执行环境分为全局执行环境(window对象)和函数执行环境。某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的变量和函数定义也会被销毁。javascript作用域(也称作用域对象或文法环境)是变量和函数的可访问范围,存储着本地变量(local variables 的字面翻译,个人认为可以理解为“可用变量”),作用域控制着函数的可见性和生命周期,当代码在一个环境中执行时,会创建一个用于搜索变量和函数的作用域链,函数不但有权访问函数作用域中的变量,而且有权访问其被包含环境,全局环境,但全局环境只能访问在全局环境中定义的变量和函数,而不能直接访问局部环境中的任何数据(牢记“我附庸的,不是我的附庸”这句话有助于理解)。

“执行环境”与“作用域”这两者的概念有一定的相关性,执行环境与行为相关联更多,作用域与范围关联更多,作用域构建在堆上。执行环境构建在栈上,两者通过作用域链联系起来。作用域存储本地变量,可保存在堆中。在浏览器中,javaScript解释器是单线程的,即在同一时刻只能做一件事,其它的行为和事件都会在执行栈中排队,某个执行环境中的所有代码执行完毕后,该环境即被销毁(将包含作用域链的对象清除出栈,被作用域链指向的堆中的本地变量就不再被引用,垃圾处理器将随即完成内存的清除工作),这种行为在栈结构中更有利于实现(修改栈顶指针即可)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值