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 页面划词搜索JS
Sep 28 Javascript
javascript继承之为什么要继承
Nov 10 Javascript
JS 两日期相减,获得天数的小例子(兼容IE,FF)
Jul 01 Javascript
jquery获取checkbox的值并post提交
Jan 14 Javascript
原生JS实现图片懒加载(lazyload)实例
Jun 13 Javascript
Vue中引入样式文件的方法
Aug 18 Javascript
详解Immutable及 React 中实践
Mar 01 Javascript
element ui 表格动态列显示空白bug 修复方法
Sep 04 Javascript
jQuery时间戳和日期相互转换操作示例
Dec 07 jQuery
JS异步宏队列微队列原理详解
Sep 09 Javascript
微信小程序实现简单的select下拉框
Nov 23 Javascript
何时使用Map来代替普通的JS对象
Apr 29 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 mongodb扩展时 需要注意的事项
2013/06/18 PHP
PHP生成制作验证码的简单实例
2016/06/12 PHP
PHP类和对象相关系统函数与运算符小结
2016/09/28 PHP
php结合md5的加密解密算法实例
2016/09/30 PHP
详解Yii2 定制表单输入字段的标签和样式
2017/01/04 PHP
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
2010/05/18 Javascript
模拟多级复选框效果的jquery代码
2013/08/13 Javascript
Js中的onblur和onfocus事件应用介绍
2013/08/27 Javascript
JS实现很酷的水波文字特效实例
2015/02/26 Javascript
JavaScript常用基础知识强化学习
2015/12/09 Javascript
vue click.stop阻止点击事件继续传播的方法
2018/09/04 Javascript
小程序实现左滑删除功能
2018/10/30 Javascript
async/await优雅的错误处理方法总结
2019/01/30 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
刷新页面后让控制台的js代码继续执行
2019/09/20 Javascript
[01:02:26]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第二场 1月18日
2021/03/11 DOTA
Python实现周期性抓取网页内容的方法
2015/11/04 Python
django 发送手机验证码的示例代码
2018/04/25 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
python采集百度搜索结果带有特定URL的链接代码实例
2019/08/30 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
如何通过命令行进入python
2020/07/06 Python
python Selenium 库的使用技巧
2020/10/16 Python
英国123鲜花网站:123 Flowers
2019/07/07 全球购物
Opodo意大利:欧洲市场上领先的在线旅行社
2019/10/24 全球购物
EJB3.1都有哪些改进
2012/11/17 面试题
应用电子专业学生的自我评价
2013/10/16 职场文书
机电一体化大学生求职信
2013/11/08 职场文书
实习心得体会
2014/01/02 职场文书
竞聘上岗演讲稿范文
2014/01/10 职场文书
《雪地里的小画家》教学反思
2014/02/22 职场文书
《世界多美呀》教学反思
2014/03/02 职场文书
党员干部公开承诺书
2014/03/26 职场文书
公司行政主管岗位职责
2015/04/09 职场文书
Nginx配置文件详解以及优化建议指南
2021/09/15 Servers
MySQL笔记 —SQL运算符
2022/01/18 MySQL