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

<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. [ZZ] 基于DirectX shader的Per-pixel lighting实现

    这个特效需要用到DX11 UAV吗? http://blog.tianya.cn/blogger/post_show.asp?BlogID=510979&PostID=5665974 Intr ...

  2. empty()与remove([expr])的区别.转

    jquery之empty()与remove()区别   要用到移除指定元素的时候,发现empty()与remove([expr])都可以用来实现.可仔细观察效果的话就可以发现.empty()是只移除了 ...

  3. DirectX基础学习系列1

    1.3 基础 1.3.1表面 表面接口:     IDirect3DSurface9 获得表面信息:GetDesc(D3DSURFACE_DESC) 获得表面接口指针 :LockRect( D3DLO ...

  4. XMLHttpRequest函数

    function createXmlHttpRequest(){ if(window.ActiveXObject){ return new ActiveXObject("Microsoft. ...

  5. Mongo中的数据类型

    一.null null用于表示空值或者不存在的字段 {"X" : null} 二.布尔型 布尔类型有两个值true和false {"x" : true} 三.数 ...

  6. Reactor 与 Proactor

    一.五种IO Model blocking IO nonblocking IO IO multiplexing signal driven IO(不常用) asynchronous IO 对于一个ne ...

  7. Sublime Text3 protobuf syntax file(语法文件)

    将以下两个文件放置在X:XXX\Sublime Text 3x64\Data\Packages\User目录下,就可以为sublime3添加protobuf文件的语法高亮规则. 文件名:Protobu ...

  8. 设计模式:简单工厂(Simple Factory)

    定义:根据提供的数据或参数返回几种可能类中的一种. 示例:实现计算器功能,要求输入两个数和运算符号,得到结果. 结构图: HTML: <html xmlns="http://www.w ...

  9. 如何写出无法维护的代码(JAVA版)

    程序命名(针对那些不能混淆的代码) 容易输入的名字.比如:Fred,asdf 单字母的变量名.比如:a,b,c, x,y,z,或者干脆上中文比如(阿隆索肯德基) 有创意地拼写错误.比如:SetPint ...

  10. 20145211 《Java程序设计》第4周学习总结——园日涉以成趣

    编程思想DRY和Once and Only Once DRY DRY原则的为"每一个知识都必须在系统内必须是单一的,明确的,权威的,具有代表性.当DRY的原则成功应用,在系统中,任何单一元素 ...