javascript嵌套函数和在函数内调用外部函数的区别分析


Posted in Javascript onJanuary 31, 2016

我们都知道在函数中定义的局部变量在声明他的函数体以及其嵌套的函数内始终是有定义的,并且在函数的作用域链上始终会有个对象指向全局对象,使函数能够访问到全局变量。

var ga = 'global';
var func = function() {
  var la = 'local';
 return function() {
    return function()
    {
      return function()
      {
        alert(la);alert(ga);
      }
    }
 }

}
a = func();
a()()();// 弹出 local 和 global

那么在外部定义的函数A, 被函数B在函数体内调用时,A能访问到B中定义的局部变量吗?答案是否定的,把上面的例子稍作修改如下

var ga = 'global';

function repeat() {
 alert(la);  
}
var func = function() {
  var la = 'local';
  alert(1);
  repeat();
  alert(2);
};

func();

上面的运行结果是只弹出了1,在调用repeat的时候,因为访问了未定义变量js解释器就报错把程序中断了。

原因是函数在定义时保存了一个作用域链,repeat函数在外部定义,在他的作用域中并没有一个局部变量叫la,继续在全局作用域查找也没找到la所以就会报错。

所以嵌套函数和在函数内嵌套调用外部函数还是有很大区别的。

昨天在回答一个问题https://3water.com/article/78958.htm时引发的思考,虽然概念我明白,但是当时一直想在函数内部调用的repeat为什么访问不到调用他的函数的局部变量,今天又翻了下参考资料自己用代码测试了一遍。希望这篇文章能帮助到有同样困惑的朋友。

Javascript 相关文章推荐
cssQuery()的下载与使用方法
Jan 12 Javascript
jQuery的12招常用技巧分享
Aug 08 Javascript
JS不能跨域借助jquery获取IP地址的方法
Aug 20 Javascript
浅谈Sublime Text 3运行JavaScript控制台
Jun 06 Javascript
详解Chart.js轻量级图表库的使用经验
May 22 Javascript
详解Angular6 热加载配置方案
Aug 18 Javascript
element-ui 的el-button组件中添加自定义颜色和图标的实现方法
Oct 26 Javascript
Vue实现移动端左右滑动效果的方法
Nov 27 Javascript
JS遍历JSON数组及获取JSON数组长度操作示例【测试可用】
Dec 12 Javascript
小程序页面动态配置实现方法
Feb 05 Javascript
微信小程序实现简易table表格
Jun 19 Javascript
axios解决高并发的方法:axios.all()与axios.spread()的操作
Nov 09 Javascript
JavaScript中eval函数的问题
Jan 31 #Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
Jan 30 #Javascript
JavaScript中的this机制
Jan 30 #Javascript
实现高性能JavaScript之执行与加载
Jan 30 #Javascript
深入探秘jquery瀑布流的实现
Jan 30 #Javascript
深入分析Javascript事件代理
Jan 30 #Javascript
详解javascript实现瀑布流列式布局
Jan 29 #Javascript
You might like
人族 TERRAN 概述
2020/03/14 星际争霸
session 的生命周期是多长
2006/10/09 PHP
用php的ob_start来生成静态页面的方法分析
2011/03/09 PHP
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
2013/06/20 PHP
php使用strtotime和date函数判断日期是否有效代码分享
2013/12/25 PHP
Yii2框架实现注册和登录教程
2016/09/30 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
php实现微信原生支付(扫码支付)功能
2018/05/30 PHP
Laravel第三方包报class not found的解决方法
2019/10/13 PHP
SWFObject Flash js调用类
2008/07/08 Javascript
Prototype源码浅析 Enumerable部分(二)
2012/01/18 Javascript
JS小功能(setInterval实现图片效果显示时间)实例代码
2013/11/28 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
js图片滚动效果时间可随意设定当鼠标移上去时停止
2014/06/26 Javascript
Validform+layer实现漂亮的表单验证特效
2016/01/17 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
WebSocket实现简单客服聊天系统
2017/05/12 Javascript
Vue使用mixins实现压缩图片代码
2018/03/14 Javascript
vue 使用高德地图vue-amap组件过程解析
2019/09/07 Javascript
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
浅析Python中元祖、列表和字典的区别
2016/08/17 Python
python在ubuntu中的几种安装方法(小结)
2017/12/08 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
Flask框架web开发之零基础入门
2018/12/10 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
2019/02/22 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
Python实现打包成库供别的模块调用
2020/07/13 Python
Python通过递归函数输出嵌套列表元素
2020/10/15 Python
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
大学竞选班长演讲稿
2014/04/24 职场文书
校运会口号
2014/06/18 职场文书
关于诚信的活动方案
2014/08/18 职场文书
2014年电话销售工作总结
2014/12/01 职场文书
正确的理解和使用Django信号(Signals)
2021/04/14 Python
Python中使用subprocess库创建附加进程
2021/05/11 Python
JAVA长虹键法之建造者Builder模式实现
2022/04/10 Java/Android