(Javascript) 猴子也明白 之 闭包超级入门 2 函数中的函数
2012-06-12 01:14
295 查看
闭包也是函数
一句话,闭包也是函数。
这是一个关键点。
然后稍微深入一点地说,
闭包是函数中的函数。
到这里,就大概理解了闭包的30%。
也就是说,有人问你
“闭包是啥玩意?”
的话,
“嗯,是写在函数中的函数吧”
如此回答,就算答对了30%。
函数中的函数
在Javascript里,函数里可以再写一个函数。稍微严谨点的说法是,可以在函数里可以定义别的函数。
//函数中定义别的函数
function outer(){
function inner(){
alert(“hello world”);
}
}
以上的代码中,如何调用inner函数呢?function outer(){
function inner(){
alert(“hello world”);
}
}
如果把以下代码Copy到记事本里,然后保存成一个,html文件,再用浏览器打开的话:
<script>
function outer(){
function inner(){
alert(“hello world”);
}
}
inner(); // 错误
</script>
以上代码将出错,画面上什么都没有。function outer(){
function inner(){
alert(“hello world”);
}
}
inner(); // 错误
</script>
因为inner只是一个在outer函数里才可用的局部变量,
在全局环境变量里并没有定义inner这个函数。
再试一下如下代码:
<script>
function outer(){
function inner(){
alert(“hello world”);
}
}
outer(); // 没有任何反应
</script>
以上代码虽然不会出错,但画面上仍然不会表示任何东西。function outer(){
function inner(){
alert(“hello world”);
}
}
outer(); // 没有任何反应
</script>
outer()虽然被执行了,但在outer里面inner只是被定义了,没有被执行。
想要inner被执行,必须在outer里明确地调用inner,如下:
<script>
function outer(){
function inner(){
alert(“hello world”);
}
inner(); // 调用了!
}
outer(); // 弹出“hello world”对话框
</script>
恭喜!著名的“Hello world”终于表示出来了。function outer(){
function inner(){
alert(“hello world”);
}
inner(); // 调用了!
}
outer(); // 弹出“hello world”对话框
</script>
outer()被执行时,首先在outer里先定义inner,然后直接执行inner--
到此,你算是理解闭包的30%了。
“函数中的函数”再稍微改进,就可以写出闭包了。
但在此之前,还得再稍微忍耐一下。
我们还得再记住两个技巧:匿名函数 和 函数返回函数
相关文章推荐
- (Javascript) 猴子也明白 之 闭包超级入门 4 函数返回函数
- (Javascript) 猴子也明白 之 闭包超级入门
- (Javascript) 猴子也明白 之 闭包超级入门 1 问题
- (Javascript) 猴子也明白 之 闭包超级入门 3 匿名函数
- (Javascript) 猴子也明白 之 闭包超级入门 5 写一个闭包
- (Javascript) 猴子也明白 之 闭包超级入门 6 闭包的用途
- [连载]JavaScript讲义(04)--- 函数和闭包
- javascript入门笔记(2)——判断、循环和函数
- 当javaScript从入门到提高前需要注意的细节:闭包部分
- JavaScript之闭包问题以及立即执行函数
- JavaScript之函数入门详解
- JavaScript中的匿名函数及函数的闭包
- JavaScript中的匿名函数及函数的闭包
- (转载)JavaScript中匿名函数,函数直接量和闭包
- JavaScript的变量及函数(变量提升、嵌套作用域、条件语句、严格模式、IIFE、闭包、模块化、this、原型)
- JavaScript 闭包在封装函数时的简单分析
- JavaScript中的匿名函数及函数的闭包
- javascript基础之七(函数闭包中this的变化)
- 【转】JavaScript中的匿名函数及函数的闭包
- javascript 函数初探 (六)--- 闭包初探#1