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 相关文章推荐
基于Web标准的UI组件 — 树状菜单(2)
Sep 18 Javascript
jquery.validate分组验证代码
Mar 17 Javascript
javascript和HTML5利用canvas构建猜牌游戏实现算法
Jul 17 Javascript
JavaScript onkeypress事件入门实例(按下或按住一个键盘按键)
Oct 17 Javascript
JavaScript获取网页表单action属性的方法
Apr 02 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
Jun 12 Javascript
微信小程序页面传值实例分析
Apr 19 Javascript
JS 组件系列之BootstrapTable的treegrid功能
Jun 16 Javascript
Vue组件之Tooltip的示例代码
Oct 18 Javascript
vue.js编译时给生成的文件增加版本号
Sep 17 Javascript
详解js获取video任意时间的画面截图
Apr 17 Javascript
JS实现网页端猜数字小游戏
Mar 06 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
PHP 批量删除数据的方法分析
2009/10/30 PHP
从PHP的源码中深入了解stdClass类
2014/04/18 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
关于javascript中的parseInt使用技巧
2009/09/03 Javascript
JavaScript 定义function的三种方式小结
2009/10/16 Javascript
js 自定义的联动下拉框
2010/02/07 Javascript
avalon js实现仿微博拖动图片排序
2015/08/14 Javascript
AngularJs Understanding the Model Component
2016/09/02 Javascript
js正则表达式惰性匹配和贪婪匹配用法分析
2016/12/26 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
jQuery插件HighCharts绘制2D饼图效果示例【附demo源码下载】
2017/03/21 jQuery
深入理解JavaScript 参数按值传递
2017/05/24 Javascript
详解探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用
2017/06/16 Javascript
Vue实战之vue登录验证的实现代码
2017/10/31 Javascript
javaScript中的空值和假值
2017/12/18 Javascript
node中使用es6/7/8(支持性与性能)
2019/03/28 Javascript
微信小程序和百度的语音识别接口详解
2019/05/06 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
2019/08/20 Javascript
js实现旋转的星空效果
2019/11/01 Javascript
浅谈关于vue中scss公用的解决方案
2019/12/02 Javascript
JavaScript实现飞舞的泡泡效果
2020/02/07 Javascript
一篇文章让你搞懂JavaScript 原型和原型链
2020/11/23 Javascript
使用Python写个小监控
2016/01/27 Python
python实现用户答题功能
2018/01/17 Python
12个Python程序员面试必备问题与答案(小结)
2019/06/24 Python
全球度假村:Club Med
2017/11/27 全球购物
寻找完美的房车租赁:RVShare
2019/02/23 全球购物
安全责任协议书
2014/04/21 职场文书
电子装配专业毕业生求职信
2014/04/23 职场文书
工作求职信
2014/07/04 职场文书
乡镇创先争优活动总结
2014/08/28 职场文书
借款协议书
2014/09/16 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
2015年乡镇发展党员工作总结
2015/03/31 职场文书
基于tensorflow权重文件的解读
2021/05/26 Python
python标准库ElementTree处理xml
2022/05/20 Python