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

发布时间 - 2026-01-11 02:46:39    点击率:

变量类型

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

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


# js  # 变量类型  # 变量作用域  # JavaScript高级程序设计之变量与作用域  # JS中作用域以及变量范围分析  # JavaScript变量作用域及内存问题实例分析  # JS块级作用域和私有变量实例分析  # javascript 的变量、作用域和内存问题  # JS变量及其作用域  # js 作用域和变量详解  # 关于JS变量和作用域详解  # JavaScript变量的作用域全解析  # JavaScript 变量、作用域及内存  # JavaScript中的变量作用域介绍  # js变量、作用域及内存详解  # 深入解析JavaScript中的变量作用域  # Javascript变量作用域详解  # JavaScript中变量的作用域详解  # 外部环境  # 都是  # 就会  # 不被  # 流进  # 自己的  # 是一个  # 是在  # 都有  # 变量值  # 多个  # 两种  # 会在  # 将其  # 我们可以  # 可以通过  # 弹出  # 为其  # 会把  # 能给 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 桂林网站制作公司有哪些,桂林马拉松怎么报名?  html如何与html链接_实现多个HTML页面互相链接【互相】  如何在阿里云完成域名注册与建站?  lovemo网页版地址 lovemo官网手机登录  公司网站制作价格怎么算,公司办个官网需要多少钱?  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  如何在腾讯云服务器快速搭建个人网站?  Laravel如何处理表单验证?(Requests代码示例)  怎么用AI帮你设计一套个性化的手机App图标?  javascript日期怎么处理_如何格式化输出  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  javascript如何操作浏览器历史记录_怎样实现无刷新导航  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何在IIS7中新建站点?详细步骤解析  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  Android自定义控件实现温度旋转按钮效果  Laravel如何与Pusher实现实时通信?(WebSocket示例)  Laravel如何配置Horizon来管理队列?(安装和使用)  如何在阿里云服务器自主搭建网站?  如何在橙子建站中快速调整背景颜色?  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  详解Android中Activity的四大启动模式实验简述  实例解析angularjs的filter过滤器  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  手机网站制作与建设方案,手机网站如何建设?  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  Python函数文档自动校验_规范解析【教程】  如何快速搭建高效香港服务器网站?  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  如何在建站宝盒中设置产品搜索功能?  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  Linux系统命令中tree命令详解  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  使用spring连接及操作mongodb3.0实例  使用Dockerfile构建java web环境  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  黑客入侵网站服务器的常见手法有哪些?  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  如何基于PHP生成高效IDC网络公司建站源码?  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解