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新的事件绑定机制on()的使用技巧
Apr 26 Javascript
javascript设置连续两次点击按钮时间间隔的方法
Oct 28 Javascript
node.js中的console.timeEnd方法使用说明
Dec 09 Javascript
window.open()实现post传递参数
Mar 12 Javascript
JavaScript实现彩虹文字效果的方法
Apr 16 Javascript
JavaScript统计网站访问次数的实现代码
Nov 18 Javascript
js获取当前页的URL与window.location.href简单方法
Feb 13 Javascript
Node.js 使用axios读写influxDB的方法示例
Oct 26 Javascript
JS document form表单元素操作完整示例
Jan 13 Javascript
javascript 内存模型实例详解
Apr 18 Javascript
如何在JS文件中获取Vue组件
Sep 16 Javascript
js面向对象封装级联下拉菜单列表的实现步骤
Feb 08 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设计模式之观察者模式定义与用法示例
2018/08/04 PHP
jquery全选/全不选/反选另一种实现方法(配合原生js)
2013/04/07 Javascript
jquery 跳到顶部和底部动画2句代码简单实现
2013/07/18 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
js实现索引图片切换效果
2015/11/21 Javascript
jQuery学习心得总结(必看篇)
2016/06/10 Javascript
bootstrap table动态加载数据示例代码
2017/03/25 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
2017/03/30 Javascript
详解vue2父组件传递props异步数据到子组件的问题
2017/06/29 Javascript
js学习总结_选项卡封装(实例讲解)
2017/07/13 Javascript
jQuery Validate插件ajax方式验证输入值的实例
2017/12/21 jQuery
angularjs数组判断是否含有某个元素的实例
2018/02/27 Javascript
ES6与CommonJS中的模块处理的区别
2018/06/13 Javascript
vue-router之实现导航切换过渡动画效果
2019/10/31 Javascript
[05:13]2018DOTA2亚洲邀请赛主赛事第二日战况回顾 LGD、VG双雄携手晋级
2018/04/05 DOTA
python time模块用法实例详解
2014/09/11 Python
python通过pip更新所有已安装的包实现方法
2017/05/19 Python
Python数据结构之顺序表的实现代码示例
2017/11/15 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
2018/04/25 Python
python绘制直线的方法
2018/06/30 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
Python collections中的双向队列deque简单介绍详解
2019/11/04 Python
python学生信息管理系统实现代码
2019/12/17 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
python实现ftp文件传输系统(案例分析)
2020/03/20 Python
Pandas数据分析的一些常用小技巧
2021/02/07 Python
CSS3实现莲花绽放的动画效果
2020/11/06 HTML / CSS
Urban Outfitters美国官网:美国生活方式品牌
2016/08/26 全球购物
Missguided美国官网:英国时尚品牌
2018/01/18 全球购物
餐饮业经理竞聘演讲稿
2014/01/14 职场文书
市场开发计划书
2014/05/07 职场文书
捐款倡议书怎么写
2014/05/13 职场文书
大型主题婚礼活动策划方案
2014/09/15 职场文书
个人事迹材料范文
2014/12/29 职场文书
党支部综合考察意见
2015/06/01 职场文书
小学数学国培研修日志
2015/11/13 职场文书