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 相关文章推荐
JavaScript 学习笔记(六)
Dec 31 Javascript
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
Feb 03 Javascript
js中继承的几种用法总结(apply,call,prototype)
Dec 26 Javascript
jQuery使用empty()方法删除元素及其所有子元素的方法
Mar 26 Javascript
延时加载JavaScript代码提高速度
Dec 27 Javascript
JS创建对象的写法示例
Nov 04 Javascript
提高Node.js性能的应用技巧分享
Aug 10 Javascript
js登录滑动验证的实现(不滑动无法登陆)
Jan 03 Javascript
解决koa2 ctx.render is not a function报错问题
Aug 07 Javascript
说说如何在Vue.js中实现数字输入组件的方法
Jan 08 Javascript
详解微信小程序文件下载--视频和图片
Apr 24 Javascript
解决Echarts2竖直datazoom滑动后显示数据不全的问题
Jul 20 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
php读取EXCEL文件 php excelreader读取excel文件
2012/12/06 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
2013/06/03 PHP
destoon之一键登录设置
2014/06/21 PHP
php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法
2015/07/06 PHP
php抽象类用法实例分析
2015/07/07 PHP
Symfony2之session与cookie用法小结
2016/03/18 PHP
php获取数据库中数据的实现方法
2017/06/01 PHP
JS性能优化笔记搜索整理
2013/08/21 Javascript
禁用JavaScript控制台调试的方法
2014/03/07 Javascript
JavaScript基础重点(必看)
2016/07/09 Javascript
JQuery实现列表中复选框全选反选功能封装(推荐)
2016/11/24 Javascript
移动端刮刮乐的实现方式(js+HTML5)
2017/03/23 Javascript
vue.js默认路由不加载linkActiveClass问题的解决方法
2017/12/11 Javascript
微信小程序实现点击文字页面跳转功能【附源码下载】
2017/12/12 Javascript
vue项目常用组件和框架结构介绍
2017/12/24 Javascript
jQuery 获取除某指定对象外的其他对象 ( :not() 与.not())
2018/10/10 jQuery
微信小程序 弹窗输入组件的实现解析
2019/08/12 Javascript
JavaScript实现通讯录功能
2020/12/27 Javascript
基于element-ui封装表单金额输入框的方法示例
2021/01/06 Javascript
[00:59]DOTA2英雄背景故事——上古巨神
2020/06/28 DOTA
Python实现的数据结构与算法之基本搜索详解
2015/04/22 Python
python制作小说爬虫实录
2017/08/14 Python
TensorFlow模型保存/载入的两种方法
2018/03/08 Python
[原创]Python入门教程5. 字典基本操作【定义、运算、常用函数】
2018/11/01 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
2020/04/24 Python
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
荷兰包包购物网站:The Little Green Bag
2018/03/17 全球购物
您熟悉ORM(Object-Relation Mapping)吗?请谈谈您所理解的ORM
2016/02/08 面试题
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
考试不及格检讨书
2014/01/09 职场文书
总会计师岗位职责
2014/02/19 职场文书
公司管理建议书范文
2014/03/12 职场文书
医德医风演讲稿
2014/05/20 职场文书
大一新生检讨书
2014/10/29 职场文书
青年文明号申报材料
2014/12/23 职场文书
Python基础知识之变量的详解
2021/04/14 Python