资讯专栏INFORMATION COLUMN

javascript嵌套函数和在函数内调用外部函数的区别

EasonTyler / 2507人阅读

摘要:昨天在回答一个问题时引发的思考,虽然概念我明白,但是当时一直想在函数内部调用的为什么访问不到调用他的函数的局部变量,今天又翻了下参考资料自己用代码测试了一遍。

我们都知道在函数中定义的局部变量在声明他的函数体以及其嵌套的函数内始终是有定义的,并且在函数的作用域链上始终会有个对象指向全局对象,使函数能够访问到全局变量。

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所以就会报错。

所以嵌套函数和在函数内嵌套调用外部函数还是有很大区别的。

昨天在回答一个问题http://segmentfault.com/q/101... 时引发的思考,虽然概念我明白,但是当时一直想在函数内部调用的repeat为什么访问不到调用他的函数的局部变量,今天又翻了下参考资料自己用代码测试了一遍。希望这篇文章能帮助到有同样困惑的朋友。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85804.html

相关文章

  • JavaScript 闯关记》之作用域和闭包

    摘要:作用域和闭包是最重要的概念之一,想要进一步学习,就必须理解作用域和闭包的工作原理。全局和局部作用域的关系在函数体内,局部变量的优先级高于同名的全局变量。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。 作用域和闭包是 JavaScript 最重要的概念之一,想要进一步学习 JavaScript,就必须理解 JavaScript 作用域和闭包的工作原理。 作用域 任何...

    Jacendfeng 评论0 收藏0
  • 前端学习笔记之闭包——看了一张图终于明白啥是闭包了

    摘要:在一个闭包环境内修改变量值,不会影响另一个闭包中的变量。直到看到函数闭包闭包这篇文章的代码一部分,终于明白其中的逻辑了。 闭包 闭包定义:指拥有多个变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。函数内部可以直接读取全局变量。函数内部变量无法在函数外部访问。函数内部声明要用var或者let声明,不然会变成全局变量链式作用域:子对象会一级级向上寻找...

    andycall 评论0 收藏0
  • Javascript 函数、作用域链与闭包

    摘要:而外层的函数不能访问内层的变量或函数,这样的层层嵌套就形成了作用域链。闭包闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。 闭包是js中一个极为NB的武器,但也不折不扣的成了初学者的难点。因为学好闭包就要学好作用域,正确理解作用域链,然而想做到这一点就要深入的理解函数,所以我们从函数说起。 函数...

    ssshooter 评论0 收藏0
  • JavaScript函数

    摘要:函数使用它们实参的值来计算返回值,称为该函数调用表达式的值。通常函数名的第一个字符为小写。在函数内部定义的变量,外部无法读取,称为局部变量。注意对于命令来说,局部变量只能在函数内部声明,在其他区块中声明,一律都是全局变量。 函数 1.函数简介 通过函数可以封装任意多条语句,而且可以在任何地方、任何时候调用。 ECMAScript中的函数使用function关键字来声明,后跟一组参数以及...

    Martin91 评论0 收藏0

发表评论

0条评论

EasonTyler

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<