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 相关文章推荐
JavaScript CSS菜单功能 改进版
Dec 20 Javascript
JavaScript获取图片的原始尺寸以宽度为例
May 04 Javascript
原生js实现自由拖拽弹窗代码demo
Jun 29 Javascript
自带气泡提示的vue校验插件(vue-verify-pop)
Apr 07 Javascript
详解Angular的8个主要构造块
Jun 20 Javascript
微信小程序实现页面跳转传值的方法
Oct 12 Javascript
node.js环境搭建图文详解
Sep 19 Javascript
iview Upload组件多个文件上传的示例代码
Sep 30 Javascript
微信小程序图片左右摆动效果详解
Jul 13 Javascript
微信小程序模板消息推送的两种实现方式
Aug 27 Javascript
在vue中利用全局路由钩子给url统一添加公共参数的例子
Nov 01 Javascript
javascript用defineProperty实现简单的双向绑定方法
Apr 03 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中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
php中用socket模拟http中post或者get提交数据的示例代码
2013/08/08 PHP
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
2013/11/14 PHP
php socket实现的聊天室代码分享
2014/08/16 PHP
PHP中如何判断exec函数执行成功?
2016/08/04 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
2019/05/29 PHP
JQuery跨Iframe选择实现代码
2010/08/19 Javascript
JavaScript使用IEEE 标准进行二进制浮点运算产生莫名错误的解决方法
2011/05/28 Javascript
javascript按位非运算符的使用方法
2013/11/14 Javascript
javascript 表格内容排序 简单操作示例代码
2014/01/03 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
2015/09/24 Javascript
使用veloticy-ui生成文字动画效果
2018/02/08 Javascript
使用Angular CLI生成 Angular 5项目教程详解
2018/03/18 Javascript
ES6的解构赋值实例详解
2019/05/06 Javascript
刷新页面后让控制台的js代码继续执行
2019/09/20 Javascript
小程序外卖订单界面的示例代码
2019/12/30 Javascript
JS定时器如何实现提交成功提示功能
2020/06/12 Javascript
使用python实现baidu hi自动登录的代码
2013/02/10 Python
linux系统使用python监控apache服务器进程脚本分享
2014/01/15 Python
python求素数示例分享
2014/02/16 Python
python利用dir函数查看类中所有成员函数示例代码
2017/09/08 Python
SVM基本概念及Python实现代码
2017/12/27 Python
python实现word 2007文档转换为pdf文件
2018/03/15 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
在python tkinter中Canvas实现进度条显示的方法
2019/06/14 Python
Python networkx包的实现
2020/02/14 Python
html5 canvas-2.用canvas制作一个猜字母的小游戏
2013/01/07 HTML / CSS
设计师珠宝:Ylang 23
2018/05/11 全球购物
Bata印度官网:源自欧洲舒适鞋履品牌
2020/01/30 全球购物
KOHLER科勒美国官网:国际著名卫浴橱柜领先品牌
2020/06/27 全球购物
面试后的感谢信范文
2014/02/01 职场文书
涨工资申请书应该怎么写?
2019/07/08 职场文书
2019年行政人事个人工作总结范本!
2019/07/19 职场文书
HTML5简单实现添加背景音乐的几种方法
2021/05/12 HTML / CSS
如何用vue实现网页截图你知道吗
2021/11/17 Vue.js
Nginx动静分离配置实现与说明
2022/04/07 Servers