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下利用arguments实现string.format函数
Aug 24 Javascript
jquery中的 $("#jb51")与document.getElementById("jb51") 的区别
Jul 26 Javascript
html中table数据排序的js代码
Aug 09 Javascript
javascript:history.go()和History.back()的区别及应用
Nov 25 Javascript
Mac/Windows下如何安装Node.js
Nov 22 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
Jun 23 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
Dec 14 Javascript
Javascript for in的缺陷总结
Feb 03 Javascript
JQuery 又谈ajax局部刷新
Nov 27 jQuery
使用koa2创建web项目的方法步骤
Mar 12 Javascript
layui 上传文件_批量导入数据UI的方法
Sep 23 Javascript
vue实现分页加载效果
Dec 24 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 和 HTML
2006/10/09 PHP
How do I change MySQL timezone?
2008/03/26 PHP
深入解析PHP的引用计数机制
2013/06/14 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
2016/02/27 PHP
PHP的Yii框架中创建视图和渲染视图的方法详解
2016/03/29 PHP
php和asp语法上的区别总结
2019/05/12 PHP
javascript中的undefined 与 null 的区别  补充篇
2010/03/17 Javascript
jQuery下通过$.browser来判断浏览器.
2011/04/05 Javascript
jquery中的mouseleave和mouseout的区别 模仿下拉框效果
2012/02/07 Javascript
使用jquery修改表单的提交地址基本思路
2014/06/04 Javascript
JavaScript生成随机数的4种自定义函数分享
2015/02/28 Javascript
jQuery EasyUI 菜单与按钮之创建简单的菜单和链接按钮
2015/11/18 Javascript
jQuery实现textarea自动增长宽高的方法
2015/12/18 Javascript
jQuery获取浏览器类型和版本号的方法
2016/07/05 Javascript
基于JS实现网页中的选项卡(两种方法)
2017/06/16 Javascript
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
浅谈js闭包理解
2019/03/28 Javascript
vue组件中传值EventBus的使用及注意事项说明
2020/11/16 Javascript
浅谈Python中用datetime包进行对时间的一些操作
2016/06/23 Python
python使用PIL模块获取图片像素点的方法
2019/01/08 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
Python类和实例的属性机制原理详解
2020/03/21 Python
Python 3.9的到来到底是意味着什么
2020/10/14 Python
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
Luxplus瑞典:香水和美容护理折扣
2018/01/28 全球购物
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
以太网Ethernet IEEE802.3
2013/08/05 面试题
生态学毕业生自荐信
2013/10/27 职场文书
生产部管理制度
2014/01/31 职场文书
安全生产中长期规划实施方案
2014/02/21 职场文书
学徒工职责
2014/03/06 职场文书
我读书我快乐演讲稿
2014/05/07 职场文书
入党个人总结范文
2015/03/02 职场文书
PHP中->和=>的意思
2021/03/31 PHP
解决numpy数组互换两行及赋值的问题
2021/04/17 Python
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL