javascript 内部函数的定义及调用
内部函数:定义在另一个函数中的函数
例如:
<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 内部函数的定义及调用的更多相关文章
- JavaScript函数定义和调用 变量作用域
本文是笔者在看廖雪峰老师JavaScript教程时的个人总结 JavaScript中函数定义可以是这样的格式 function 函数名(参数) { 函数体 } 也可以是这样的格式 ...
- 函数定义和调用 -------JavaScript
本文摘要:http://www.liaoxuefeng.com/ 定义函数 在JavaScript中,定义函数的方式如下: function abs(x) { if (x >= 0) { ret ...
- JavaScript jQuery 中定义数组与操作及jquery数组操作
首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象Javascript不支持多 ...
- [译] 理解PHP内部函数的定义(给PHP开发者的PHP源码-第二部分)
文章来自:http://www.hoohack.me/2016/02/10/understanding-phps-internal-function-definitions-ch 原文:https:/ ...
- javascript函数的定义与执行
要理解javascript函数的定义与执行,首先需要知道这几个重要的概念,现在可以先知道稍后再理解! 函数的执行环境(excution context).活动对象(call object).作用域(s ...
- Javascript函数(定义、传值、重载)
Javascript 函数的定义的方式有不止一种. 第一种方式: function fn1(){ alert(typeof fn1); alert(“fn1”); } 在调用的时候直接就可以fu1() ...
- javascript 构造函数方式定义对象 (转载)
javascript 构造函数方式定义对象 javascript是动态语言,可以在运行时给对象添加属性,也可以给对象删除(delete)属性 <html> <head> & ...
- MATLAB循环和函数定义,调用
格式不要括号,最后有end for 循环变量 = 表达式1:表 2:表 3 表1:初值 表2:步长 表3:终值 求圆周率:π/4=1 - 1/3 + 1/5 -1/7+...+(-1 ...
- JavaScript jQuery 中定义数组与操作及jquery数组操作 http://www.jb51.net/article/76601.htm
首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象Javascript不支持多 ...
随机推荐
- 2016.05.04,英语,《Vocabulary Builder》Unit 22
acerb/acri: comes from the Latin adjective acer, meaning 'sharp' or 'sour'. acerbic: [ə'sɜːrbɪk] adj ...
- PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [7] APP 错误日志接口
APP 上线以后可能遇到的问题: ① APP 强退 ② 数据加载失败 ③ APP 潜在问题 错误日志需要记录的内容 数据表 error_log 字段: id app_id:app 类别 id did: ...
- TCP协议中的三次握手和四次挥手(图解)(转载http://blog.csdn.net/whuslei/article/details/6667471)
建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源 ...
- C#winform中ListView的使用
使用ListView模仿Windows系统的资源管理器界面,实现文件(夹)的浏览.重命名.删除及查询等功能,主要功能界面展示如下: 1.MainForm.cs及MainForm.Designer.cs ...
- 11.PHP内核探索:嵌入式PHP PHP内核探索:嵌入式PHP
从PHP源码目录结构的介绍以及PHP生命周期可知:嵌入式PHP类似CLI,也是SAPI接口的另一种实现. 一般情况下,它的一个请求的生命周期也会和其它的SAPI一样:模块初始化=>请求初始化=& ...
- Address localhost:1099 is already in use 的错误
http://blog.csdn.net/huazhongkejidaxuezpp/article/details/41813683
- 【Java 进阶篇】【第一课】String类
引用 String类包含在java.lang包中.这个包会在Java启动的时候自动import,所以可以当做一个内置类(built-in class).我们不需要显式的使用import引入String ...
- SublimeText使用技巧
1.安装package control:ctrl+~ 2.调出命令面板:ctrl+shift+p 3.快出查找(goto Anything):ctrl+p 4.修改文件类型:ctrl+shift+p ...
- Aptana Studio 3的汉化
Aptana Studio 3(下面简称Aptana 3)的汉化方法 1.找到这个网站 http://aptana.com/support 2.单击下面的链接 view documentation 在 ...
- sql 主外键
alter table Orders add CONSTRAINT fk_PerOrders FOREIGN KEY(id) REFERENCES Persons(Id) 以上SQL中,Persons ...