JavaScript-变量的作用域 、const、let

作用域

局部函数

在javascript中,var定义变量实际是有作用域的。
假设在函数体中声明,则在函数体外不可以使用~(如果非要使用的话,可以用闭包

function qj() {var x = 1;x = x + 1;
}
x = x + 2;  // Uncaught ReferenceError: x is not defined

如果两个函数使用了相同的变量名,只要在函数内部,就不冲突

function qj() {var x = 1;x = x + 1;
}
function qj2() {var x = 'A';x = x + 1;
}

内部函数可以访问外部函数的成员,反之则不行

function qj() {var x = 1;console.log(x)// 内部函数可以访问外部函数的成员,反之则不行function qj2() {var y = x + 1;console.log(y)}qj2()var z = y + 1;console.log(z)
}

在这里插入图片描述
假设,内部函数变量和外部函数的变量,重名!

function qj() {var x = 1;function qj2() {var x = 'A';console.log('内 '+x)}qj2()console.log('外 '+x)}
qj()

假设在JavaScript中函数查找变量从自身函数开始~,由 “内” 向 “外” 查找,假设外部存在这个同名的函数,则内部函数会屏蔽外部函数的变量。
在这里插入图片描述


提升变量的作用域

function qj() {var x = 'X' + y;console.log(x)var y = 'y';
}

结果: Xundefined
说明:JavaScript执行引擎,自动提升了y的声明,但是不会提升变量y的赋值,等价于:

function qj() {var y;var x = 'X' + y;console.log(x)y = 'y';
}

这个是在JavaScript建立之初就存在的特性,养成规范:所有变量定义都放在函数的头部,不要乱放,便于代码维护;

function qj2() {var x = 1,y = x + 1,z,i,a;//undefined// 之后随意使用
}

全局函数

// 全局变量
x = 1;
function f() {console.log(x)
}
f()
console.log(x)

全局对象window

var x = 'xxx';
alert(x)
alert(window.x) // 默认所有的全局变量,都会自动绑定在Window对象下

alert()这个函数本身也是一个Window变量,使用window.alert()是一样的

var x = 'xxx';
window.alert(x)
var old_alert = window.alert;
window.alert = function () {
}
// 发现alert()失效了
window.alert(123)
// 恢复
window.alert = old_alert
window.alert(456)

Javascript实际上只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,报错ReferenceError


规范
由于我们所有的全局变量都会绑定到我们的window上,如果不同的js文件,使用了相同的全局变量,就会冲突~ -->如何能够减少冲突?

// 唯一全局变量
var wangApp = {};// 定义全局变量
wangApp.name = 'wang';
wangApp.add = function (a,b) {console.log(a+b);return a+b;
}

把自己的代码全部放入自己定义的唯一空间名字中,降低全局命名冲突的问题~


局部作用域let

function aa() {for (var i = 0; i < 100; i++) {console.log(i)}console.log(i+1); // 101 问题? i 出了这个作用域还能使用
}

ES6 let关键字,解决局部作用域冲突问题!

function aa() {for (let i = 0; i < 100; i++) {console.log(i)}console.log(i+1); // Uncaught ReferenceError: i is not defined
}

建议大家都使用let去定义局部作用域的变量。

常量 const

在ES6之前,怎么定义常量:只有用全部大写字母命名的变量就是常量;建议不要修改这样的值

var PI = '3.14';
console.log(PI)
PI = '132'; // 可以修改成功
console.log(PI)

在ES6引入了常量关键字const

const PI = '3.14';
console.log(PI)
PI = '132'; // Uncaught TypeError: Assignment to constant variable.
console.log(PI)

https://www.bilibili.com/video/BV1JJ41177di?p=13&spm_id_from=pageDriver

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea 开启Run DashBoard

文章目录1.项目的.idea文件夹下&#xff0c;打开workspace.xml文件2. 添加 RunDashboard 节点&#xff1a;IDEA中&#xff0c;run dashboard是一个直观、方便好用的面板 1.项目的.idea文件夹下&#xff0c;打开workspace.xml文件 2. 添加 RunDashboard 节点&#xff1a; <co…

那些你不知道的 LVS 秘密!

作者 | 故事凌责编 | 郭芮近来在群里,看到大家说对lvskeepalived不太了解&#xff0c;我想我应该是有发言权的。自己本身就是运维出身&#xff0c;原来在京东物流的时候&#xff0c;lvskeepalived就是仓库物流在用的&#xff0c;踩了很多坑&#xff0c;只不过后来都上云了&…

从零到破万节点!支撑618大促背后的蚂蚁金服Kubernetes集群

2019年天猫618大促&#xff0c;蚂蚁金服首次在大促中对调度系统和技术栈全面应用Kubernetes&#xff0c;突破了Kubernetes单集群万节点的规模&#xff0c;总节点数达到数十万个&#xff0c;这是世界最大规模的 Kubernetes 集群之一&#xff0c;而这距离开发团队下载Kubernetes代…

MongoDB 定位 oplog 必须全表扫描吗?

MongoDB oplog &#xff08;类似于 MySQL binlog&#xff09; 记录数据库的所有修改操作&#xff0c;除了用于主备同步&#xff1b;oplog 还能玩出很多花样&#xff0c;比如 全量备份 增量备份所有的 oplog&#xff0c;就能实现 MongoDB 恢复到任意时间点的功能通过 oplog&am…

JavaScript-方法

方法的定义 方法就是把函数放在对象里面 var wang {name: 网络,birth: 2020,// 方法age: function () {// 今年 - 出生的年var now_year new Date().getFullYear();return now_year-this.birth} } // 属性 wang.name // 方法&#xff0c;一定要带() kuangshen.age()拆开上面…

Python程序员30行代码素描表白!网友:花里胡哨

总有人说程序员不够浪漫&#xff01;其实我们只是没时间而已&#xff0c;等我们有时间了&#xff0c;还有普通人什么事儿&#xff1f;最近就有一个小伙伴上热搜了&#xff01;原来他用Python给可爱的女朋友画了一幅素描&#xff01;不到30行代码&#xff0c;一起来学学给她一个…

解读NoSQL最新现状和趋势:云NoSQL数据库将成重要增长引擎

NoSQL最早起源于1998年&#xff0c;但从2009年开始&#xff0c;NoSQL真正开始逐渐兴起和发展。回望历史应该说NoSQL数据库的兴起&#xff0c;完全是十年来伴随互联网技术&#xff0c;大数据数据的兴起和发展&#xff0c;NoSQL在面临大数据场景下相对于关系型数据库运用&#xf…

使用EMR-Kafka Connect进行数据迁移

1.背景 流式处理中经常会遇到Kafka与其他系统进行数据同步或者Kafka集群间数据迁移的情景。使用EMR Kafka Connect可以方便快速的实现数据同步或者数据迁移。 Kafka Connect是一种可扩展的、可靠的&#xff0c;用于在Kafka和其他系统之间快速地进行流式数据传输的工具。例如可…

亚信安全发布“安全定义边界”2020发展理念 赋能企业在5G时代的数字化安全运营能力

2020年4月21日&#xff0c;以“信行合一 聚势致远”为主题的亚信安全2020合作伙伴大会正式在云端拉开帷幕&#xff0c;超过1500家生态伙伴相聚云端&#xff0c;在为期3天的大会上共话安全&#xff0c;共商发展。会上&#xff0c;亚信安全正式发布“安全定义边界”2020发展理念&…

JavaScript-Date日期对象

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <script>const now new Date(); // Tue Aug 10 2021 15:32:27 GMT0800 (中国标准时间)now.g…

如何实现input输入框自带清除按钮

最近&#xff0c;项目中需要&#xff0c;在输入框获取焦点是动态显示“”图标。即在输入框中输入内容时&#xff0c;右边显示“”按钮&#xff1b;输入框为空时&#xff0c;“”按钮消失。难点在于获取焦点的同时&#xff0c;获取输入内容。 注意&#xff1a;本例子的样式基于…

python-解码 decode 报错的问题

当解码使用默认的 decode() 拨错时&#xff0c;可以设置 errors 参数的值来解决 print(line) line_de_replace line.decode(errorsreplace).strip() # 用&#xff1f;代替 print("line_de_replace:", line_de_replace) line_de_ignore line.decode(errorsignore)…

字节码技术在模块依赖分析中的应用

背景 近年来&#xff0c;随着手机业务的快速发展&#xff0c;为满足手机端用户诉求和业务功能的迅速增长&#xff0c;移动端的技术架构也从单一的大工程应用&#xff0c;逐步向模块化、组件化方向发展。以高德地图为例&#xff0c;Android 端的代码已突破百万行级别&#xff0…

华为发布基于自进化AI的HiSec Insight安全态势感知系统

2020年4月21日&#xff0c;华为举办“安全新视界&#xff0c;AI知未然”主题线上发布会&#xff0c;邀请第三方研究机构、行业客户和合作伙伴共同探讨安全态势感知系统的演进方向&#xff0c;并见证华为HiSec Insight安全态势感知系统的全新面世。华为HiSec Insight安全态势感知…

“做好大数据测试,我是认真的!”

阿里妹导读&#xff1a;大数据已然是当下的重要课题&#xff0c;大大小小的企业在重视大数据的同时&#xff0c;也渐渐重视大数据质量的问题。阿里巴巴测试开发专家小郅&#xff0c;今天会分享他对数据测试的系统性思考。文章内容架构清晰&#xff0c;内容较长&#xff0c;建议…

从安全到镜像流水线,Docker 最佳实践与反模式一览

作者 | Timothy Mugayi译者 | 弯月&#xff0c;责编 | 夕颜封图 | CSDN付费下载自视觉中国出品 | CSDN&#xff08;ID:CSDNnews&#xff09;在使用Docker的大部分时间里&#xff0c;我们并不关心其内部的工作原理。仅凭启动一个Docker容器并且让应用程序运行良好&#xff0c;并…

ChaosBlade 发布对 C++ 应用混沌实验的支持

前言 为满足 C 应用系统故障演练&#xff0c;阿里妈妈安全生产团队开源了 C 混沌实验执行器&#xff0c;填补了 C 应用混沌工程实验的空白&#xff0c;其遵循《混沌实验模型》&#xff0c;可通过 ChaosBlade 工具直接执行。项目详情点击这里&#xff01; 。 本文重点介绍该执…

TortoiseGitPlink提示输入密码解决方法

文章目录一、现象二 、解决方法2.1. 打开TortoiseGit 下的puttygen工具2.2. 点击load&#xff0c;加载私钥2.3. 生成一个新的私钥2.4. 项目拉取2.5. 配置新的私钥一、现象 二 、解决方法 2.1. 打开TortoiseGit 下的puttygen工具 双击D:\software\TortoiseGit\bin下面的puttyg…

引领高并发直播场景进入毫秒时代,阿里云发布超低延时直播服务

近日&#xff0c;阿里云上线超低延时直播服务RTS&#xff08;Real-time Streaming&#xff09;&#xff0c;该服务在视频直播产品的基础上&#xff0c;进行全链路延时监控、传输协议改造等底层技术优化&#xff0c;支持千万级并发场景下的毫秒级延迟直播能力&#xff0c;保障低…

JavaScript-面向对象 class 继承

class继承 class 关键字是在ES6引入的 ES6之前的写法&#xff1a; function Student(name) {this.name name } // 给Student新增一个方法 Student.prototype.hello function () {alert(Hello) }ES6的写法&#xff1a; // 定义一个 学生的 类 class Student1{constructor(…