JS函数本身的作用域实例分析


Posted in Javascript onMarch 16, 2020

本文实例讲述了JS函数本身的作用域。分享给大家供大家参考,具体如下:

函数本身也是一个值,也有自己的作用域。它的作用域与变量一样,就是其声明时所在的作用域,与其运行时所在作用域无关。

var a = 1
var x = function() {
 console.log(a)
}

function f() {
 var a = 2
 x()
}

f()

上面代码中,函数x是在函数f的外部声明的,所以它的作用域绑定外层,内部变量a不会到函数f体内取值,所以输出1,而不是2。

总之,函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域

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

function y(f) {
 var a = 2;
 f();
}

y(x)
// ReferenceError: a is not defined

上面代码将函数x作为参数,传入函数y。但是x是在函数y体外声明的,作用域绑定外层,因此找不到函数y的内部变量a,导致报错。

同样的函数本内部声明的函数,作用域绑定在函数体内部

function foo() {
 var x = 1;
 function bar () {
 console.log(x)
 }
 return bar
}
var x = 2 
var f = foo()
f() // 1

箭头函数的作用域,是和父级上下文绑定在一起的

var obj = {
 id: 1,
 show: () => {
 console.log(this.id)
 }
}

 
obj.show() // undefined

上面代码show函数是一个箭头函数,其this指向父级,而父级是一个顶级对象,window,window.id没有定义,所以返回undefined

var obj = {
 id: 2,
 show: function() {
 return () => {
  console.log(this.id)
 }
 }
}

obj.show()() // 2

上面代码中,箭头函数定义在show函数内部,其父级作用域为show函数的作用域,show函数中this指向调用show函数的对象,即obj,obj中有id属性,且值为2,所以输出2

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
js限制文本框只能输入数字(正则表达式)
Jul 15 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
Apr 15 Javascript
JS定时器实例详细分析
Oct 11 Javascript
jquery基础教程之数组使用详解
Mar 10 Javascript
jQuery Ajax()方法使用指南
Nov 19 Javascript
jQuery实现分隔条左右拖动功能
Nov 21 Javascript
javascript实现粘贴qq截图功能(clipboardData)
May 29 Javascript
jQuery数组处理函数整理
Aug 03 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
Aug 11 Javascript
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
Aug 29 Javascript
vue forEach循环数组拿到自己想要的数据方法
Sep 21 Javascript
详解vuex持久化插件解决浏览器刷新数据消失问题
Apr 15 Javascript
JavaScript实现tab栏切换效果
Mar 16 #Javascript
vue-cli3使用mock数据的方法分析
Mar 16 #Javascript
vue-cli3.0实现一个多页面应用的历奇经历记录总结
Mar 16 #Javascript
vue从零实现一个消息通知组件的方法详解
Mar 16 #Javascript
JavaScript实现动态留言板
Mar 16 #Javascript
vue中的双向数据绑定原理与常见操作技巧详解
Mar 16 #Javascript
js+canvas实现纸牌游戏
Mar 16 #Javascript
You might like
我的论坛源代码(一)
2006/10/09 PHP
php扩展ZF――Validate扩展
2008/01/10 PHP
关于Iframe如何跨域访问Cookie和Session的解决方法
2013/04/15 PHP
PHP获取当前页面完整URL的实现代码
2013/06/10 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
2016/01/22 PHP
laravel自定义分页的实现案例offset()和limit()
2019/10/15 PHP
javascript 操作select下拉列表框的一点小经验
2010/03/20 Javascript
js中查找最近的共有祖先元素的实现代码
2010/12/30 Javascript
ExtJs使用总结(非常详细)
2012/03/22 Javascript
UpdatePanel和Jquery冲突的解决方法
2013/04/01 Javascript
JavaScript中合并数组的N种方法
2014/09/16 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
2015/09/04 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
图文详解Heap Sort堆排序算法及JavaScript的代码实现
2016/05/04 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
2016/11/10 Javascript
jQuery Ajax前后端使用JSON进行交互示例
2017/03/17 Javascript
vue.js默认路由不加载linkActiveClass问题的解决方法
2017/12/11 Javascript
浅谈React中的元素、组件、实例和节点
2018/02/27 Javascript
JavaScript动态加载重复绑定问题
2018/04/01 Javascript
从零开始用electron手撸一个截屏工具的示例代码
2018/10/10 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
es6函数之尾递归用法实例分析
2020/04/25 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
在Python的循环体中使用else语句的方法
2015/03/30 Python
深入学习python的yield和generator
2016/03/10 Python
详解python之简单主机批量管理工具
2017/01/27 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
2020/04/18 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
2019/10/12 Python
python的range和linspace使用详解
2019/11/27 Python
python调用c++返回带成员指针的类指针实例
2019/12/12 Python
Django中ORM找出内容不为空的数据实例
2020/05/20 Python
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
预备党员期盼十八届四中全会召开思想汇报
2014/10/17 职场文书
2014年干部作风建设总结
2014/10/23 职场文书
2015年信访工作总结
2015/04/07 职场文书