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之典型高阶函数应用介绍
Jan 10 Javascript
用JS提交参数创建form表单在FireFox中遇到的问题
Jan 16 Javascript
SublimeText自带格式化代码功能之reindent
Dec 27 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
Jun 06 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
Jun 21 Javascript
JavaScript实现自动切换图片代码
Oct 11 Javascript
微信小程序canvas写字板效果及实例
Jun 15 Javascript
微信小程序picker组件下拉框选择input输入框的实例
Sep 20 Javascript
vue iview多张图片大图预览、缩放翻转
Jul 13 Javascript
JS实现返回上一页并刷新页面的方法分析
Jul 16 Javascript
微信小程序中网络请求缓存的解决方法
Dec 29 Javascript
JavaScript实现字符串与HTML格式相互转换
Mar 17 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类包含的七种语法说明
2015/06/04 PHP
CodeIgniter使用smtp服务发送html邮件的方法
2015/06/10 PHP
PHP批量生成图片缩略图的方法
2015/06/18 PHP
php新建文件的方法实例
2019/09/26 PHP
PHP实现简单的协程任务调度demo示例
2020/02/01 PHP
利用onresize使得div可以随着屏幕大小而自适应的代码
2010/01/15 Javascript
js获取html参数及向swf传递参数应用介绍
2013/02/18 Javascript
JavaScript建立一个语法高亮输入框实现思路
2013/02/26 Javascript
jQuery标签替换函数replaceWith()的使用例子
2014/08/28 Javascript
AngularJS HTML编译器介绍
2014/12/06 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
jQuery 3 中的新增功能汇总介绍
2016/06/12 Javascript
好好了解一下Cookie(强烈推荐)
2016/06/14 Javascript
利用babel将es6语法转es5的简单示例
2017/12/01 Javascript
js断点调试经验分享
2017/12/08 Javascript
详解vue中localStorage的使用方法
2018/11/22 Javascript
微信小程序基于picker实现级联菜单
2019/02/15 Javascript
Python使用Flask框架获取当前查询参数的方法
2015/03/21 Python
Python中文件操作简明介绍
2015/04/13 Python
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
浅谈Python实现Apriori算法介绍
2017/12/20 Python
在django中图片上传的格式校验及大小方法
2019/07/28 Python
Python一行代码解决矩阵旋转的问题
2019/11/30 Python
Python实现将蓝底照片转化为白底照片功能完整实例
2019/12/13 Python
Python的in,is和id函数代码实例
2020/04/18 Python
tensorflow模型转ncnn的操作方式
2020/05/25 Python
python编写一个会算账的脚本的示例代码
2020/06/02 Python
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
Pharmacy Online中文直邮网站:澳洲大型药房
2020/06/27 全球购物
远东集团网络工程师面试题
2014/10/20 面试题
军训自我鉴定
2014/01/22 职场文书
高三励志标语
2014/06/05 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
大学生党员学习焦裕禄精神思想汇报
2014/09/10 职场文书
六一儿童节主持开场白
2015/05/28 职场文书
react 路由Link配置详解
2021/11/11 Javascript