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多种数据类型表格排序代码分析
Sep 11 Javascript
前后台交互过程中json格式如何解析以及如何生成
Dec 26 Javascript
javascript特殊用法示例介绍
Nov 29 Javascript
javascript计时器编写过程与实现方法
Feb 29 Javascript
浅谈jQuery 中的事件冒泡和阻止默认行为
May 28 Javascript
深入浅析JavaScript中的Function类型
Jul 09 Javascript
JavaScript表单验证开发
Nov 23 Javascript
基于vue2.0+vuex+localStorage开发的本地记事本示例
Feb 28 Javascript
Angular.js基础学习之初始化
Mar 10 Javascript
js获取html页面代码中图片地址的实现代码
Mar 05 Javascript
通过cordova将vue项目打包为webapp的方法
Feb 02 Javascript
node 解析图片二维码的内容代码实例
Sep 11 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 IP及IP段进行访问限制的代码
2008/12/17 PHP
PHP动态页生成静态页的3种常用方法
2014/11/13 PHP
PHP MVC框架skymvc支持多文件上传
2016/05/26 PHP
PHP中的日期时间处理利器实例(Carbon)
2017/06/09 PHP
js资料toString 方法
2007/03/13 Javascript
学习ExtJS Window常用方法
2009/10/07 Javascript
div模拟选择框示例代码
2013/11/03 Javascript
给文字加上着重号的JS代码
2013/11/12 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
2015/07/01 Javascript
原生JS实现仿淘宝网左侧商品分类菜单效果代码
2015/09/10 Javascript
11种ASP连接数据库的方法
2015/09/18 Javascript
基于JavaScript实现表单密码的隐藏和显示出来
2016/03/02 Javascript
jQuery之简单的表单验证实例
2016/07/07 Javascript
js获取上传文件的绝对路径实现方法
2016/08/02 Javascript
JavaScript 详解预编译原理
2017/01/22 Javascript
vuex的简单使用教程
2018/02/02 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
2018/02/26 Javascript
redux-saga 初识和使用
2018/03/10 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
2019/01/15 Javascript
解决vue项目打包上服务器显示404错误,本地没出错的问题
2020/11/03 Javascript
[01:19:34]2014 DOTA2国际邀请赛中国区预选赛 New Element VS Dream time
2014/05/22 DOTA
[01:00:25]NB vs Secret 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
Linux下为不同版本python安装第三方库
2016/08/31 Python
Python numpy.array()生成相同元素数组的示例
2018/11/12 Python
python常用库之NumPy和sklearn入门
2019/07/11 Python
美国孩之宝玩具官网:Hasbro Pulse
2019/06/24 全球购物
Strathberry苏贝瑞中国官网:西班牙高级工匠手工打造
2020/10/19 全球购物
入党思想汇报
2014/01/05 职场文书
人力资源部经理助理岗位职责
2014/03/04 职场文书
贫困证明书格式及范文
2014/10/15 职场文书
毕业生见习报告总结
2014/11/08 职场文书
2016年班主任新年寄语
2015/08/18 职场文书
2016教师年度考核评语大全
2015/12/01 职场文书
css3 filter属性的使用简介
2021/03/31 HTML / CSS
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
2021/05/21 Python