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 相关文章推荐
使用jscript实现二进制读写脚本代码
Jun 09 Javascript
Javascript 设计模式(二) 闭包
May 26 Javascript
在JS数组特定索引处指定位置插入元素的技巧
Aug 24 Javascript
Javascript 多物体运动的实现
Dec 24 Javascript
jQuery实现根据类型自动显示和隐藏表单
Mar 18 Javascript
JavaScript中数据结构与算法(二):队列
Jun 19 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
Jun 27 Javascript
jquery实现转盘抽奖功能
Jan 06 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
Apr 27 Javascript
node.js通过axios实现网络请求的方法
Mar 05 Javascript
layui 表单标签的校验方法
Sep 04 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
Jul 21 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
PHPMailer邮件发送的实现代码
2013/05/04 PHP
PHP读取RSS(Feed)简单实例
2014/06/12 PHP
PHP中的事务使用实例
2015/05/26 PHP
php中Snoopy类用法实例
2015/06/19 PHP
laravel框架中间件简单使用方法示例
2020/01/25 PHP
php模拟post提交请求调用接口示例解析
2020/08/07 PHP
javascript一点特殊用法
2008/05/28 Javascript
Jquery下:nth-child(an+b)的使用注意
2011/05/28 Javascript
node.js中的http.response.writeHead方法使用说明
2014/12/14 Javascript
vue子组件使用自定义事件向父组件传递数据
2017/05/27 Javascript
vue 请求后台数据的实例代码
2017/06/22 Javascript
JavaScript从原型到原型链深入理解
2019/06/03 Javascript
JavaScript监听键盘事件代码实现
2020/06/03 Javascript
解决vue打包报错Unexpected token: punc的问题
2020/10/24 Javascript
[03:12]2016完美“圣”典风云人物:单车专访
2016/12/02 DOTA
使用python获取CPU和内存信息的思路与实现(linux系统)
2014/01/03 Python
用pandas按列合并两个文件的实例
2018/04/12 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
java判断三位数的实例讲解
2019/06/10 Python
python内存动态分配过程详解
2019/07/15 Python
Django模板语言 Tags使用详解
2019/09/09 Python
如何使用Python发送HTML格式的邮件
2020/02/11 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
2020/05/25 Python
基于matplotlib中ion()和ioff()的使用详解
2020/06/16 Python
Python bisect模块原理及常见实例
2020/06/17 Python
python的flask框架难学吗
2020/07/31 Python
详解python中的闭包
2020/09/07 Python
Python通过类的组合模拟街道红绿灯
2020/09/16 Python
Django用户认证系统如何实现自定义
2020/11/12 Python
美国Lolё官网:购买大胆而美丽的女性运动服装
2017/05/22 全球购物
HearthSong官网:儿童户外玩具、儿童益智玩具
2017/10/16 全球购物
高级护理专业毕业生推荐信
2013/12/25 职场文书
高三自我评价
2014/02/01 职场文书
学生请假条
2014/04/11 职场文书
查摆问题自我剖析材料
2014/08/18 职场文书
退休欢送会致辞
2015/07/31 职场文书