2019独角兽企业重金招聘Python工程师标准>>>

内部函数:定义在另一个函数中的函数
例如:

1

2

3

4

5

6

7

<script>

    function outer(){

        function inner(){

        }  

    }

</script> 

inner()就是一个被包含在outer()作用域中的内部函数,所以:
在outer()内部调用inner()函数有效,
在outer()外部调用inner()函数无效。
例如:

1

2

3

4

5

6

7

8

9

10

11

12

13

<script>

    function outer(){

        console.log('外部函数');

        function inner(){

            console.log('内部函数');

        }

        inner();

    }

    console.log('outer():');

    outer();

    console.log('inner():');

    inner();

</script>

结果:
outer():
外部函数
内部函数
inner():
Uncaught ReferenceError: inner is not defined(报错)

-----------------------------------------------------------------------------

1.如何在任何地方调用内部函数
javascript允许像传递任何类型的数据一样传递函数,也就是说,javascript中的内部函数能够逃脱定义他们的外部函数。
方式:
① 给内部函数指定一个全局变量

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<script>

    var globalVar;

        function outer(){

            console.log('外部函数');

            function inner(){

                console.log('内部函数');

            }  

        globalVar = inner; 

    }

    console.log("outer():");

    outer();

    console.log("globalVar():");

    globalVar();

    console.log("inner():");

    inner();

</script>

结果:
outer():
外部函数
globalVar():
内部函数
inner():
Uncaught ReferenceError: inner is not defined(报错)

-----------------------------------------------------------------------------
inner():会报错是因为虽然内部函数通过把引用保存在全局变量中实现了逃脱,但这个函数的名字仍然被截留在outer()的作用域中。

在函数定义之后调用outer()会修改全局变量globalVar,因为globalVar引用的是innerFn(),所以在执行globalVar()的时候,相当于调用了inner()一样,得到了以上结果。

② 通过在父函数中返回值来实现对内部函数的引用( return )

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<script>

    function outer(){

        console.log('外部函数');

        function inner(){

            console.log('内部函数');

        }

        return inner;

    }

    console.log('var res = outer():');

    var res = outer();

    console.log("res():");

    res();

    console.log("outer():");

    outer();

    console.log("inner():");

    inner();

</script>

结果:
var res = outer():
外部函数
res():
内部函数
outer():
外部函数
inner():
Uncaught ReferenceError: inner is not defined(报错)

-----------------------------------------------------------------------------
2. 变量作用域
1) 内部函数的变量都被限制在内部函数作用域中

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<script>

    function outer(){

        console.log('外部函数')

        function inner(){

            var innerVar = 0;

            innerVar ++;

            console.log('内部函数 innerVar=' + innerVar );

        }

        return inner;

    }

    var res = outer();

    res();

    res();

    var res2 = outer();

    res2();

    res2();

</script>

每当通过某种方式调用这个内部函数时,都会创建一个新的变量innerVar,然后递增
结果:
外部函数
内部函数 innerVar=1
内部函数 innerVar=1
外部函数
内部函数 innerVar=1
内部函数 innerVar=1

-----------------------------------------------------------------------------
2)内部函数可以像其他函数一样引用全局变量

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<script>

    var innerVar = 0;

        function outer(){

            console.log('外部函数')

            function inner(){

                innerVar ++;

                console.log('内部函数 innerVar=' + innerVar );

            }

        return inner;

    }

    var res = outer();

    res();

    res();

    var res2 = outer();

    res2();

    res2();

</script>

结果:
外部函数
内部函数 innerVar=1
内部函数 innerVar=2
外部函数
内部函数 innerVar=3
内部函数 innerVar=4

-----------------------------------------------------------------------------
3)内部函数会继承父函数的作用域,因此内部函数也可以引用父函数的变量

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<script>

    function outer(){

        var innerVar = 0;

        console.log('外部函数')

        function inner(){

            innerVar ++;

            console.log('内部函数 innerVar=' + innerVar );

        }

        return inner;

    }

    var res = outer();

    res();

    res();

    var res2 = outer();

    res2();

    res2();

</script>

结果:
外部函数
内部函数 innerVar=1
内部函数 innerVar=2
外部函数
内部函数 innerVar=1
内部函数 innerVar=2

转载于:https://my.oschina.net/airship/blog/824556

javascript 内部函数的定义及调用相关推荐

  1. 高级JavaScript Day03 | 函数定义和调用、this、严格模式、高阶函数、闭包、递归

    1.函数的定义和调用 1.1 函数的定义方式 1.函数的声明方式 function关键字 (命名函数) // 1. 自定义函数(命名函数)function fn() {}; 2.函数表达式 (匿名函数 ...

  2. 在JavaScript函数中定义全局变量

    是否可以在JavaScript函数中定义全局变量? 我想在其他函数中使用trailimage变量(在makeObj函数中声明). <html xmlns="http://www.w3. ...

  3. JavaScript 函数的定义

    一.关于函数 JavaScript函数是指一个特定代码块,可能包含多条语句,可以通过名字来供其他语句调用以执行函数包含的代码语句. 比如我们有一个特定的功能需要三条语句实现 那么每次想实现这个功能的时 ...

  4. python函数定义和调用_函数定义和调用

    定义函数 在JavaScript中,定义函数的方式如下: function abs(x) { if (x >= 0) { return x; } else { return -x; } } 上述 ...

  5. matlab调用sh函数,Shell 函数定义与调用

    linux shell 可以用户定义函数,然后在 shell 脚本中可以随便调用. 以一个计算两数之和的函数为例: #! /bin/bash # 函数定义 sum(){ return $(($1+$2 ...

  6. JavaScript 中,定义函数时用 var foo = function () {} 和 function foo() 有什么区别?

    某天写代码突然县道这个问题,顺势总结一波 JavaScript 函数和变量声明的"提前"(hoist)行为 简单的说 如果我们使用 匿名函数 var a = {} 这种方式, 编译 ...

  7. 7.1.3 Python进阶 《函数》定义、调用,参数,返回值《面向对象》概念,类,实例,对象,属性,方法《模块、包》导入,自定义,常用内置:datatime,time,random,os,sys

    目录 ======== 第四部分 Python进阶 ======== 第一节 函数 4.1.1 函数定义及调用 4.1.2 函数的参数 4.1.3 函数的返回值 第二节 面向对象 4.2.1 面向对象 ...

  8. javaScript函数的定义和arguments,result关键字

    javaScript函数的定义和arguments,result关键字 函数的两种定义方式 function abs(x) {if(x>0){return x;}else {return -x; ...

  9. JavaScript函数的定义和参数的获取

    大家好,今天我们来分享一下JavaScript的函数以及参数的获取 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. <!DOCTYPE html> <html> ...

最新文章

  1. UITT-欧盟MiFID II新监管法规实践先行者
  2. FFmpeg Filter基本使用
  3. java vote_vote投票系统java jsp mysql
  4. php字符串中删除字符串函数,PHP 实现删除任意区间内字符串函数方法
  5. 在建工地扬尘在线监控系统推荐_关于印发《建设工地扬尘在线监控管理平台建设工作方案》的通知...
  6. 程序入口地址的直接定制表【 (1) 清屏(2) 设置前景色 (3) 设置背景色 (4) 向上滚动一行】...
  7. 误删文件恢复软件哪款好
  8. pc弹窗宽度_弹窗设计的5条原则
  9. 数据挖掘背景知识2——数据挖掘可以做到什么 带给我们什么?
  10. 优化滚动的一个小技巧:scroll-snap-type
  11. iframe中加入html,HTML中IFRAME标签的使用
  12. 【luogu P3426】SZA-Template(字符串)(KMP)
  13. Python中的文本替换
  14. linux系统添加根证书 linux证书信任列表
  15. 全国计算机软考网络管理员考试大纲(2012)
  16. 时间片轮转算法(c++)
  17. 我的物联网项目(十八) 城市合伙人战略
  18. xerosploit中间人攻击软件安装及简易使用
  19. 代码高处走 从VC6到VC9移植代码问题说明
  20. 福禄克测试报告转换软件,福禄克推出新一代电能质量分析软件Fluke Power Pioneer-测试测量-与非网...

热门文章

  1. LaTeX 公式输入软件 KLatexFormula
  2. 【前端开发与项目管理】
  3. VirtualBox快照(Snapshot)功能使用及注意事项
  4. 艾伟_转载:C#中的委托和事件-抛砖引玉
  5. 已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法...
  6. YYAnimatedImageView--gif在ios14之后只能播放一次
  7. Framework 动态库加载 xib
  8. dr.oracle素颜霜好用吗,dr.jart+ V7素颜霜怎么样?不适合干皮
  9. 左右声道测试音频_关于制作左右声道音频的剪辑软件推荐
  10. js mysql 住宿系统_[源码和文档分享]基于JavaScript和MySQL实现的酒店管理系统