JavaScript变量类型以及变量作用域详解

 更新时间:2017年08月14日 10:30:44   作者:粥要熬  
这篇文章主要为大家详细介绍了JavaScript变量类型以及变量作用域的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

变量类型

ECMAScript变量可能包含两种不同类型的数据值:基本类型和引用类型。

基本类型

基本类型指的是简单的数据段,5种基本数据类型:undefined、null、boolean、number、string,基本数据类型是按值访问的,因此可以操作保存在变量中的实际的值。

复制变量值

从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上。例如:

var num1 = 5;
var num2 = num1;

复制前的变量对象

这里写图片描述

复制后的变量对象

这里写图片描述

引用类型

引用类型指那些可能由多个值构成的对象,引用类型的值是保存在内存中的对象,JavaScript不允许直接访问内存中的位置,在操作对象时,实际上是在操作对象的引用而不是实际的对象,因此,引用类型的值是按引用访问的。

动态属性

引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法。如果对象不被销毁或者这个属性不被删除,则这个属性将一直存在,但是我们不能给基本类型的值添加属性。例如:

var person = new Object();
person.say = "hello";
alert(person.say); //"hello"

复制变量值

从一个变量向另一个变量复制引用类型的值时,也会将存储在变量对象中的值复制一份放到为新变量分配的空间中,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制结束后,两个变量实际上将引用同一个对象,改变其中一个变量,就会影响另一个变量。例如:

var obj1 = new Object();
var obj2 = obj1;
obj1.say = "hello";
alert(obj2.say); //"hello"

这里写图片描述

传递参数

ECMAScript中所有函数的参数都是按值传递的,把函数外部的值复制给函数内部的参数。在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量;在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。例如:

function addTen(num) {
 num += 10;
 return num;
}
var count = 20;
var result = addTen(count);
alert(count);  //20 
alert(result);  //30

执行环境及作用域

执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为。
全局执行环境是最外围的执行环境,在WEB浏览器中,全局执行环境被认为是window对象,因此全局变量和属性都是作为window的属性和方法创建的。
每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中,在函数执行之后,栈将其弹出,将控制权返回给之前的执行环境。
当代码在一个环境中执行时,会创建变量对象的一个作用域链,作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端始终是当前指行代码所在的变量对象,作用域链中下一个变量对象来自外部环境,再下一个变量对象来自下一个外部环境,这样一直延续到全局环境,全局执行环境的变量对象始终是作用域链的最后一个对象。
标识符解析是沿着作用域链一级一级地搜索标识符的过程。搜索过程始终从作用域链的前端开始,然后逐级地向后回溯,直到找到标识符为止。

这里写图片描述

内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。

无块级作用域

JavaScript中没有块级作用域,例如:

if(true){
 var color = "blue";
}
alert(color);  //"blue"

在函数中未使用var声明的变量会被成全局变量,例如:

function add(num1,num2){
 sum = num1 + num2;
 return sum;
}
var result = add(10,20);
alert(sum);  //30

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 使用javascript实现监控视频播放并打印日志

    使用javascript实现监控视频播放并打印日志

    这篇文章主要介绍了使用javascript实现监控视频播放并打印日志的方法及示例代码分享,非常不错,需要的朋友可以参考下
    2015-01-01
  • js实现的美女瀑布流效果代码

    js实现的美女瀑布流效果代码

    美女瀑布流效果分享一下,大家勿喷啊 借用新浪的美女 嘿嘿 睁大你的眼睛
    2012-11-11
  • JS中如何轻松遍历对象属性的方式总结

    JS中如何轻松遍历对象属性的方式总结

    这篇文章主要给大家总结介绍了关于在JS中如何轻松遍历对象属性的方式,文中通过示例代码介绍的非常详细,对大家学习或者使用JS具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • javascript canvas时钟模拟器

    javascript canvas时钟模拟器

    这篇文章主要为大家详细介绍了javascript canvas时钟模拟器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • JS实现页面滚动到关闭时的位置与不滚动效果

    JS实现页面滚动到关闭时的位置与不滚动效果

    这篇文章主要介绍了JS实现页面滚动到关闭时的位置与不滚动效果,滚动有两种方案,其一,利用路由中的meta,在离开页面时缓存 top 信息,其二,利用keep-alive缓存整个页面。但是仅限于没有实时数据变动的页面,需要的朋友可以参考下本文
    2022-06-06
  • js删除数组元素、清空数组的简单方法(必看)

    js删除数组元素、清空数组的简单方法(必看)

    下面小编就为大家带来一篇js删除数组元素、清空数组的简单方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • H5上传本地图片并预览功能

    H5上传本地图片并预览功能

    这篇文章主要为大家详细介绍了H5上传本地图片并预览的实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • JavaScript 组件之旅(四):测试 JavaScript 组件

    JavaScript 组件之旅(四):测试 JavaScript 组件

    本期,我们要讨论的话题是 JavaScript 的测试,以检查组件的状态和工作方式是否符合预期,还会介绍一个可以方便编写测试用例的测试方法。这里说的测试当然是使用自动化的测试手段,这是软件质量保证(QA)的重要环节。
    2009-10-10
  • js弹出确认是否删除对话框

    js弹出确认是否删除对话框

    这篇文章主要介绍了js弹出确认是否删除对话框,具体实现代码如下,需要的朋友可以参考下
    2014-03-03
  • 网页中的图片查看器viewjs使用方法

    网页中的图片查看器viewjs使用方法

    下面小编就为大家带来一篇网页中的图片查看器viewjs使用方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07

最新评论