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 相关文章推荐
不用ajax实现点击文字即可编辑的方法
Dec 16 Javascript
[推荐]javascript 面向对象技术基础教程
Mar 03 Javascript
用JavaScript实现单继承和多继承的简单方法
Mar 29 Javascript
JavaScript高级程序设计 DOM学习笔记
Sep 10 Javascript
JQuery入门—编写一个简单的JQuery应用案例
Jan 03 Javascript
nullJavascript中创建对象的五种方法实例
May 07 Javascript
基于jquery实现的可编辑下拉框实现代码
Aug 02 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
Jul 20 Javascript
jquery validation验证表单插件
Jan 07 Javascript
vue-lazyload图片延迟加载插件的实例讲解
Feb 09 Javascript
Vue在页面数据渲染完成之后的调用方法
Sep 11 Javascript
全面分析JavaScript 继承
May 30 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
使用Apache的rewrite技术
2006/06/22 PHP
php 设计模式之 工厂模式
2008/12/19 PHP
jQuery 表格插件整理
2010/04/27 Javascript
extjs中grid中嵌入动态combobox的应用
2011/01/01 Javascript
深入理解JS中的变量及作用域、undefined与null
2014/03/04 Javascript
jQuery对象的length属性用法实例
2014/12/27 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
JavaScript采用递归算法计算阶乘实例
2015/08/04 Javascript
第三章之Bootstrap 表格与按钮功能
2016/04/25 Javascript
AngularJS控制器之间的数据共享及通信详解
2016/08/01 Javascript
JavaScript实现解析INI文件内容的方法
2016/11/17 Javascript
jQuery的事件预绑定
2016/12/05 Javascript
浅谈JavaScript正则表达式-非捕获性分组
2017/03/08 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
2017/04/12 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
利用es6 new.target来对模拟抽象类的方法
2019/05/10 Javascript
Javascript三种字符串连接方式及性能比较
2019/05/28 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
2019/07/07 Javascript
JS原型对象操作实例分析
2020/06/06 Javascript
微信小程序实现导航栏和内容上下联动功能代码
2020/06/29 Javascript
用Nodejs实现在终端中炒股的实现
2020/10/18 NodeJs
Vue 事件的$event参数=事件的值案例
2021/01/29 Vue.js
[33:17]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
使用python开发vim插件及心得分享
2014/11/04 Python
Python3 元组tuple入门基础
2020/02/09 Python
python实现微信打飞机游戏
2020/03/24 Python
Pycharm同步远程服务器调试的方法步骤
2020/11/04 Python
加拿大购物频道:The Shopping Channel
2016/07/21 全球购物
最新销售员个人自荐信
2013/09/21 职场文书
学习新党章思想汇报
2014/01/09 职场文书
美国探亲签证邀请信
2014/02/05 职场文书
生物学专业求职信
2014/07/23 职场文书
2014年维修工作总结
2014/11/22 职场文书
基于Redis过期事件实现订单超时取消
2021/05/08 Redis