JS中的变量作用域(console版)


Posted in Javascript onJuly 18, 2020

作用域说明:指一个变量的作用范围

1.全局作用域

(1) 全局作用域在页面打开时被创建,页面关闭时被销毁
(2) 编写在script标签中的变量和函数,作用域为全局,在页面的任意位置都可以访问到
(3) 在全局作用域中有全局对象window,代表一个浏览器窗口,由浏览器创建,可以直接调用
(4) 全局作用域中声明的变量和函数会作为window对象的属性和方法保存

var a = 10;
b = 20;
function an(){
  console.log('an')
}
var bn = function(){
  console.log('bn')
}
console.log(window)

如图,变量a,b和函数an,bn都保存在window对象上

JS中的变量作用域(console版)

(5) window对象的属性和方法可以直接调用,如window.an() 可以写为 an()

2.函数作用域:

(1) 调用函数时,函数作用域被创建,函数执行完毕,函数作用域被销毁

function an(){
    var s = 'an'
    console.log(s);
}
//an();

此时函数an并没有执行,作用域没有创建,当函数执行时,作用域创建,输出结果an

an();

JS中的变量作用域(console版)

(2) 每调用一次函数就会创建一个新的函数作用域,他们之间是相互独立的

(3) 在函数作用域中可以访问到全局作用域的变量,在函数外无法访问到函数作用域内的变量

function an(){
  var s = 'an'
  console.log(s);
}
an();
console.log(s); // 此时,程序会从当前作用域和上级作用域及以上作用域中寻找变量s,并不会去下级作用域中寻找

JS中的变量作用域(console版)

(4) 在函数作用域中访问变量、函数时,会先在自身作用域中寻找,若没有找到,则会到函数的上一级作用域中寻找,一直到全局作用域
(5) 在函数作用域中也有声明提前的特性,对于变量和函数都起作用,此时函数作用域相当于一个小的全局作用域,详细声明提前请看声明提前部分

an();
bn();
function an(){
    var s = 'an'
    console.log(s);
}
var bn = function(){
    console.log('bn')
}

下图就结果中,an()可以正常执行,函数an()提升并创建了,函数bn的变量名提升了,但是为赋值,此时bn不是函数

JS中的变量作用域(console版)

(6) 在函数作用域中,不使用变量关键字声明的变量,在赋值时会往上一级作用域寻找已经声明的同名变量,直到全局作用域时还没找到,则会成为window的属性

an(); // 输出结果 bn
function an(){
  var b = 'bn';
  function bn(){
    console.log(b); 
	b = 'bn2';  // b会往上一级寻找已经声明的同名变量,并赋值,直到全局作用域时还没找到,则会成为window的属性
  }
  bn();
  console.log(b); // 输出 bn2
}

(7) 在函数中定义形参,等同于声明变量

function an(name){
  console.log(name); // 输出 undefined
}
an();

等同于

function an(){
  var name
  console.log(name); // 输出 undefined
}
an();

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

Javascript 相关文章推荐
javascript的对话框详解与参数
Mar 08 Javascript
jquery toolbar与网页浮动工具条具体实现代码
Jan 12 Javascript
JavaScript原生对象之Date对象的属性和方法详解
Mar 13 Javascript
深入解读JavaScript中的Hoisting机制
Aug 12 Javascript
易操作的jQuery表单提示插件
Dec 01 Javascript
bootstrap制作jsp页面(根据值让table显示选中)
Jan 05 Javascript
Easyui笔记2:实现datagrid多行删除的示例代码
Jan 14 Javascript
基于jQuery实现的打字机效果
Jan 16 Javascript
在vue里面设置全局变量或数据的方法
Mar 09 Javascript
解决axios发送post请求返回400状态码的问题
Aug 11 Javascript
浅析vue给不同环境配置不同打包命令
Aug 17 Javascript
js中arguments对象的深入理解
May 14 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
完美解决通过IP地址访问VUE项目的问题
Jul 18 #Javascript
You might like
php写入数据到CSV文件的方法
2015/03/14 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
2016/02/14 PHP
php 时间time与日期date之间的使用详解及区别
2016/11/07 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
javascript 复杂的嵌套环境中输出单引号和双引号
2009/05/26 Javascript
csdn 论坛技术区平均给分功能
2009/11/07 Javascript
js监听表单value的修改同步问题,跨浏览器支持
2009/12/31 Javascript
javascript转换字符串为dom对象(字符串动态创建dom)
2010/05/10 Javascript
JS继承 笔记
2011/07/13 Javascript
Jquery中使用setInterval和setTimeout的方法
2013/04/08 Javascript
浅析jquery的js图表组件highcharts
2014/03/06 Javascript
javascript控制在光标位置插入文字适合表情的插入
2014/06/09 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
jquery实现鼠标点击后展开列表内容的导航栏效果
2015/09/14 Javascript
Jquery树插件zTree实现菜单树
2017/01/24 Javascript
JavaScript设计模式之策略模式详解
2017/06/09 Javascript
vue-cli中的webpack配置详解
2017/09/25 Javascript
vue利用better-scroll实现轮播图与页面滚动详解
2017/10/20 Javascript
小程序实现发表评论功能
2018/07/06 Javascript
Echarts实现单条折线可拖拽效果
2019/12/19 Javascript
[01:10:49]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
python微信公众号之关键词自动回复
2018/06/15 Python
python使用插值法画出平滑曲线
2018/12/15 Python
提升Python程序性能的7个习惯
2019/04/14 Python
Python中一些深不见底的“坑”
2019/06/12 Python
numpy按列连接两个维数不同的数组方式
2019/12/06 Python
Python3如何在Windows和Linux上打包
2020/02/25 Python
Python3爬虫里关于Splash负载均衡配置详解
2020/07/10 Python
python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析
2021/02/20 Python
python openpyxl模块的使用详解
2021/02/25 Python
迎八一活动主题
2014/01/31 职场文书
老师的检讨书
2014/02/23 职场文书
廉洁自律承诺书2015
2015/01/22 职场文书
虎兄虎弟观后感
2015/06/12 职场文书
初中同学会致辞
2015/08/01 职场文书
Vue2项目中对百度地图的封装使用详解
2022/06/16 Vue.js