JS中作用域以及变量范围分析


Posted in Javascript onJuly 18, 2020

变量作用域

js作为一门脚本语言,他与c,java这些语言是不相同的。

全局变量

在js中声明全局变量,有下面几种方式:

1.在函数外通过var来声明。

var test ="hello";
console.log(test);
function a(){
  test="xx";
  console.log(test);
}
a();
console.log(test);

结果:

hello
xx
xx

这种方式通过声明的变量在任何地方都可进行修改和使用。

2.在函数中隐士的声明变量

function a(){
  test=22;
  console.log(test);
}
a();
console.log(test);

结果:

22
22

因为js是弱类型脚本语言,在使用之前无需定义,所以可以通过这种方式也能声明全局变量。

来看一个反例:

var test="aa";
console.log(test);
function a(test){
  test=22;
  console.log(test);
}
a(test);
console.log(test);

结果:

aa
22
aa

可以看到在函数中修改了test值可是第二次在函数外打印的值没有变。这是因为在函数的过程中只是进行了值传递。局部变量覆盖掉了全局变量,只是局部变量 在 修改。

因为在函数的参数内定义的变量并不是全局变量。

反例二:

function a(){
  var test="aa";
  console.log(test);
}
a();
console.log(test);

结果

aa
notdefine

在函数内通过var来声明的变量是局部变量,函数外无法访问。

变量作用域

js的作用域和c与java这些语言的作用域也不相同,骚小孩在以前经常会因为这个而头疼,后来在认真学习了以后才懂了。

1.js中没有块范围。

if(1!=1){
  var y=c;
}
console.log(y)
 
if(1==1){
  var x=a;
}
console.log(x);

结果:

undefine
a

可以看到在if代码块定义的两个变量,在if块之外去打印,如果判断成功的话,才会去执行里边的声明语句,声明语句执行了,那么在代码块外边就可访问到了。

也可以看出在代码块中声明的变量也是全局变量。

2.js中的全局变量都会成为window的属性

var x=0;
console.log(window.x);

结果:

0

3.变量提升

var c=0;
function a(){
  console.log(c);
}
a();

结果:

0

var c=0;
function a(){
  console.log(c);
  var c=11;
}
a();

结果:

undefine

可以看出在函数中加了一行声明语句结果就会不同,这产生这样的原因是什么呢?

其实第二个代码块的执行顺序是这样的:

var c=0;
function a(){
  var c;
  console.log(c);
  c=11;
}
a();

在函数中他会先把声明语句提升到第一行,但是并不提升赋值。然后局部变量覆盖全局变量,在打印c的时候局部变量还没来的

及赋值所以就是undefine。

变量提升不只会提升会执行的变量,不会执行的变量也会进行提升:

var c=10;
function a(){
  console.log(c);
  if(false) {
    var c = 10;
  }
}
a();

结果:

undefine

因为在if判断中定义了局部变量c,虽然if条件不成立,但是也会进行变量提升,所以打印c也是undefine;

4.let变量

通过上面的例子可以看到用var来定义变量的弊端:

1.var定义的变量没有块作用域;

2.var定义的全局变量会自动添加全局window对象的属性;

3.var变量会提前装载(变量提升);

let就是为了解决这些问题而诞生的。

for(let i=0;i<5;i++){
  
}
console.log(i);

结果:

报错

在代码块中定义了let变量,在外部引用的时候不会存在。即存在块作用域。

let i=10;
console.log(window.i);

结果:

undefine

let声明的变量并不会成为window的属性。

var c=10;
function a(){
  console.log(c);
  let c=1;
  console.log(c);
}
a();

在函数中存在变量与全局变量名相同的c,因此会覆盖掉全局变量c,但是由于let不会提前装载,所以在第一个打印语句打印c时会报错。

到此这篇关于JS中作用域以及变量范围分析的文章就介绍到这了,更多相关JS变量作用域内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jquery控制listbox中项的移动并排序的实现代码
Sep 28 Javascript
JS 获取滚动条高度示例代码
Oct 24 Javascript
window.onload和$(function(){})的区别介绍
Oct 30 Javascript
node.js中的fs.statSync方法使用说明
Dec 16 Javascript
javascript定义变量时加var与不加var的区别
Dec 22 Javascript
javascript实现的简单计时器
Jul 19 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
Oct 24 Javascript
Javascript设计模式之装饰者模式详解篇
Jan 17 Javascript
详解ES6中的代理模式——Proxy
Jan 08 Javascript
Koa项目搭建过程详细记录
Apr 12 Javascript
vue路由--网站导航功能详解
Mar 29 Javascript
JavaScript进阶(三)闭包原理与用法详解
May 09 Javascript
JS中的变量作用域(console版)
Jul 18 #Javascript
js里面的变量范围分享
Jul 18 #Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
Jul 18 #Javascript
深入理解 ES6中的 Reflect用法
Jul 18 #Javascript
详谈Object.defineProperty 及实现数据双向绑定
Jul 18 #Javascript
webpack+vue-cil 中proxyTable配置接口地址代理操作
Jul 18 #Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
Jul 18 #Javascript
You might like
PHP中的超全局变量
2006/10/09 PHP
php minixml详解
2008/07/19 PHP
PHP实现上传文件并存进数据库的方法
2015/07/16 PHP
PHP提高编程效率的20个要点
2015/09/23 PHP
PHPMailer ThinkPHP实现自动发送邮件功能
2018/06/10 PHP
PHP使用POP3读取邮箱接收邮件的示例代码
2020/07/08 PHP
鼠标图片振动代码
2006/07/06 Javascript
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
2010/12/11 Javascript
Jquery实现网页跳转或用命令打开指定网页的解决方法
2013/07/09 Javascript
Javscript删除数组中指定元素并返回新数组
2014/03/06 Javascript
深入浅析Node.js 事件循环
2015/12/20 Javascript
详解VUE 定义全局变量的几种实现方式
2017/06/01 Javascript
js中的事件委托或是事件代理使用详解
2017/06/23 Javascript
基于vue cli重构多页面脚手架过程详解
2018/01/23 Javascript
实例解析Vue.js下载方式及基本概念
2018/05/11 Javascript
webpack4 CSS Tree Shaking的使用
2018/09/03 Javascript
ES6 对象的新功能与解构赋值介绍
2019/02/05 Javascript
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
2019/07/03 jQuery
layUI实现前端分页和后端分页
2019/07/27 Javascript
浅谈Python在pycharm中的调试(debug)
2018/11/29 Python
pytorch多进程加速及代码优化方法
2019/08/19 Python
解决Python发送Http请求时,中文乱码的问题
2020/04/30 Python
Python尾递归优化实现代码及原理详解
2020/10/09 Python
pytorch中index_select()的用法详解
2021/01/06 Python
Ellos丹麦:时尚和服装在线
2016/09/19 全球购物
Joe Fresh官网:加拿大时尚品牌和零售连锁店
2016/11/30 全球购物
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
法国床上用品商店:La Compagnie du lit
2019/12/26 全球购物
北京一家公司的.net开发工程师笔试题
2012/04/17 面试题
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
四风自我剖析材料
2014/09/30 职场文书
幼儿园学前班幼儿评语
2014/12/29 职场文书
教师工作表现评语
2014/12/31 职场文书
管理人员岗位职责
2015/02/14 职场文书
穷人该怎么创业?谨记以下几点
2019/07/11 职场文书
在Oracle表中进行关键词搜索的过程
2022/06/10 Oracle