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

<script>
    function outer(){
        function inner(){

        }
    }
</script> 

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

<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中的内部函数能够逃脱定义他们的外部函数。
方式:
① 给内部函数指定一个全局变量

<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 )

<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) 内部函数的变量都被限制在内部函数作用域中

<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)内部函数可以像其他函数一样引用全局变量

<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)内部函数会继承父函数的作用域,因此内部函数也可以引用父函数的变量

<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

                    学习的时候做的笔记 ,资料 《 jquery 基础教程(第四版) 》

javascript 内部函数的定义及调用的更多相关文章

  1. JavaScript函数定义和调用 变量作用域

     本文是笔者在看廖雪峰老师JavaScript教程时的个人总结   JavaScript中函数定义可以是这样的格式 function 函数名(参数) {     函数体 } 也可以是这样的格式     ...

  2. 函数定义和调用 -------JavaScript

    本文摘要:http://www.liaoxuefeng.com/ 定义函数 在JavaScript中,定义函数的方式如下: function abs(x) { if (x >= 0) { ret ...

  3. JavaScript jQuery 中定义数组与操作及jquery数组操作

    首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象Javascript不支持多 ...

  4. [译] 理解PHP内部函数的定义(给PHP开发者的PHP源码-第二部分)

    文章来自:http://www.hoohack.me/2016/02/10/understanding-phps-internal-function-definitions-ch 原文:https:/ ...

  5. javascript函数的定义与执行

    要理解javascript函数的定义与执行,首先需要知道这几个重要的概念,现在可以先知道稍后再理解! 函数的执行环境(excution context).活动对象(call object).作用域(s ...

  6. Javascript函数(定义、传值、重载)

    Javascript 函数的定义的方式有不止一种. 第一种方式: function fn1(){ alert(typeof fn1); alert(“fn1”); } 在调用的时候直接就可以fu1() ...

  7. javascript 构造函数方式定义对象 (转载)

    javascript 构造函数方式定义对象   javascript是动态语言,可以在运行时给对象添加属性,也可以给对象删除(delete)属性 <html> <head> & ...

  8. MATLAB循环和函数定义,调用

    格式不要括号,最后有end for 循环变量 = 表达式1:表 2:表 3 表1:初值     表2:步长      表3:终值 求圆周率:π/4=1 - 1/3 + 1/5 -1/7+...+(-1 ...

  9. JavaScript jQuery 中定义数组与操作及jquery数组操作 http://www.jb51.net/article/76601.htm

    首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象Javascript不支持多 ...

随机推荐

  1. PHP 错误与异常 笔记与总结(3)PHP 配置文件(php.ini)中与错误相关的选项 与 设置错误级别

    [PHP 配置文件中与错误相关的选项 ] 选项 描述 error_reporting 设置错误报告的级别 display_errors 是否显示错误 log_errors 设置是否将错误信息记录到日志 ...

  2. ThinkPHP 学习笔记 ( 四 ) 数据库操作之关联模型 ( RelationMondel ) 和高级模型 ( AdvModel )

    一.关联模型 ( RelationMondel ) 1.数据查询 ① HAS_ONE 查询 创建两张数据表评论表和文章表: tpk_comment , tpk_article .评论和文章的对应关系为 ...

  3. 转载~vim配置文件

    转载自:小码哥的博客 花了很长时间整理的,感觉用起来很方便,共享一下. 我的vim配置主要有以下优点: 1.按F5可以直接编译并执行C.C++.java代码以及执行shell脚本,按“F8”可进行C. ...

  4. 数据库MySql阶段总结

    S1数据库中最重要的是查询,对于查询要有一个好的理解模型是很关键的: 1. 每一个查询都会返回一个结果集,这个结果集可能是一个值,一个字段或者一个记录,甚至可能是一个表 返回一个值 SELECT * ...

  5. javaWeb中servlet开发——过滤器

    servlet开发--过滤器(filter) servlet有三种,分为简单servlet.过滤器servlet.监听servlet 简单servlet是作为一种程序所必须的开发结构保存的,继承htt ...

  6. Natural Language Toolkit

    http://www.nltk.org/ >>> import nltk >>> nltk.download()

  7. epoll 应用

    /*  * test_bittube.cpp  *  *  Created on: 2015年7月13日  *      Author: ting.guit  */ #include <bind ...

  8. 【转】Unity3D的输入(Input)——键盘和鼠标

    http://blog.csdn.net/lingyun_blog/article/details/41451565 Unity3D使用input类控制用户的输入,输入包括了用户键盘,鼠标,触摸,重力 ...

  9. spark mllib 之线性回归

    public static void main(String[] args) { SparkConf sparkConf = new SparkConf() .setAppName("Reg ...

  10. 智能手机,医疗诊断,云会议(gotomeeting/citrix)

    在诊断领域已出现很多大有希望的创新,它们可能会起到真正的变革作用. 例如,有一种新技术可以让健康护理工作者用一部智能手机拍摄高质量的视网膜图像.这些数码照片像素很高,足以帮助检测白内障.黄斑退化.糖尿 ...