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操作iframe里的dom(实例讲解)
Jan 29 Javascript
Windows 系统下安装和部署Egret的开发环境
Jul 31 Javascript
JavaScript实现简单图片翻转的方法
Apr 17 Javascript
javascript中Date对象的使用总结
Nov 21 Javascript
Bootstrap表单使用方法详解
Feb 17 Javascript
js实现图片上传预览原理分析
Jul 13 Javascript
angular之ng-template模板加载
Nov 09 Javascript
vue.js将时间戳转化为日期格式的实现代码
Jun 05 Javascript
详解vuex commit保存数据技巧
Dec 25 Javascript
Vue移动端实现图片上传及超过1M压缩上传
Dec 23 Javascript
vue如何使用外部特殊字体的操作
Jul 30 Javascript
Axios代理配置及封装响应拦截处理方式
Apr 07 Vue.js
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实现框架(一)
2006/10/09 PHP
同一空间绑定多个域名而实现访问不同页面的PHP代码
2006/12/06 PHP
程序员编程十条戒律
2009/07/09 PHP
PHP MemCached高级缓存配置图文教程
2010/08/05 PHP
php实现的mongodb操作类
2015/05/28 PHP
PHP defined()函数的使用图文详解
2019/07/20 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
js同时按下两个方向键
2007/12/01 Javascript
jquery select多选框的左右移动 具体实现代码
2013/07/03 Javascript
SeaJS 与 RequireJS 的差异对比
2014/12/08 Javascript
JavaScript插件化开发教程(六)
2015/02/01 Javascript
JavaScript操作Oracle数据库示例
2015/03/06 Javascript
jQuery中通过ajax调用webservice传递数组参数的问题实例详解
2016/05/20 Javascript
深入浅析JS Function()构造函数
2016/08/22 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
3分钟掌握常用的JS操作JSON方法总结
2017/04/25 Javascript
解决webpack -p压缩打包react报语法错误的方法
2017/07/03 Javascript
JS中async/await实现异步调用的方法
2019/08/28 Javascript
[54:53]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第二场
2014/05/23 DOTA
[01:01:52]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第二场 1月9日
2021/03/11 DOTA
python获取豆瓣电影简介代码分享
2014/01/16 Python
Python守护进程用法实例分析
2015/06/04 Python
Python只用40行代码编写的计算器实例
2017/05/10 Python
Python入门_学会创建并调用函数的方法
2017/05/16 Python
50行Python代码实现人脸检测功能
2018/01/23 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
2018/07/18 Python
Django Rest framework频率原理与限制
2019/07/26 Python
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
2013/01/09 HTML / CSS
车队司机自我鉴定
2014/03/02 职场文书
给学校的建议书
2014/03/12 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
python使用XPath解析数据爬取起点小说网数据
2021/04/22 Python
如何利用opencv判断两张图片是否相同详解
2021/07/07 Python
php去除数组中为0的元素的实例分析
2021/11/17 PHP
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers