JS闭包
2016-12-15 00:00
399 查看
摘要: js中关于闭包
关于闭包的概念,我们需要了解js的变量。
首先js的变量可以是任何东西,属性、方法、对象,都可以作为变量。变量分为全局变量和局部变量。在Js中函数的内部可以读取全局变量,这点和JAVA相似。
但是局部变量,却不能在外边直接使用,这点也和Java相似,会出现错误。
值得注意的一点,就是什么内部变量的时候,一定要注意使用var。不然的话你申明的就是一个全局变量。
由此可以看出来,就是把一下不需要用在全局的变量,放到一个封闭的空间(函数、对象、命名空间)中,但是我们却需要里面的一些变量,那么这个时候就需要闭包了,闭包就是链接外部函数和内部函数的桥梁。。
###2.调用局部变量
一般而言,我们需要调用一个简单的局部变量是不能实现的。
我们需要使用返回值,获取内部内部变量。
这里,Counter 函数返回两个闭包,函数 increment 和函数 get。 这两个函数都维持着 对外部作用域 Counter 的引用,因此总可以访问此作用域内定义的变量 count。
###3.循环中闭包
上面的代码不会输出数字 0 到 9,而是会输出数字 10 十次。
当 console.log 被调用的时候,匿名函数保持对外部变量 i 的引用,此时 for循环已经结束, i 的值被修改成了 10.
为了得到想要的结果,需要在每次循环中创建变量 i 的拷贝。
使用下面方式
1.闭包
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。关于闭包的概念,我们需要了解js的变量。
首先js的变量可以是任何东西,属性、方法、对象,都可以作为变量。变量分为全局变量和局部变量。在Js中函数的内部可以读取全局变量,这点和JAVA相似。
var i=100; function f1(){ alert(i); } f1();//100
但是局部变量,却不能在外边直接使用,这点也和Java相似,会出现错误。
function f1(){ var i=100; } f1(); alert(i);//i is not defined
值得注意的一点,就是什么内部变量的时候,一定要注意使用var。不然的话你申明的就是一个全局变量。
function f1(){ i=100; } f1(); alert(i);//100
由此可以看出来,就是把一下不需要用在全局的变量,放到一个封闭的空间(函数、对象、命名空间)中,但是我们却需要里面的一些变量,那么这个时候就需要闭包了,闭包就是链接外部函数和内部函数的桥梁。。
###2.调用局部变量
一般而言,我们需要调用一个简单的局部变量是不能实现的。
function f1(){ var i=100; } alert(f1.i);//undefined
我们需要使用返回值,获取内部内部变量。
function Counter(start) { var count = start; return { increment: function() { count++; }, get: function() { return count; } } } var result = Counter(4); console.log(result.increment()); console.log(result.get());
这里,Counter 函数返回两个闭包,函数 increment 和函数 get。 这两个函数都维持着 对外部作用域 Counter 的引用,因此总可以访问此作用域内定义的变量 count。
###3.循环中闭包
for(var i = 0; i < 10; i++) { setTimeout(function() { console.log(i); }, 1000); }
上面的代码不会输出数字 0 到 9,而是会输出数字 10 十次。
当 console.log 被调用的时候,匿名函数保持对外部变量 i 的引用,此时 for循环已经结束, i 的值被修改成了 10.
为了得到想要的结果,需要在每次循环中创建变量 i 的拷贝。
使用下面方式
for(var i = 0; i < 10; i++) { setTimeout((function() { console.log(i); })(i), 1000); }
自执行匿名函数: 常见格式:(function() { /* code */ })(); 解释:包围函数(function(){})的第一对括号向脚本返回未命名的函数,随后一对空括号立即执行返回的未 命名函数,括号内为匿名函数的参数。 作用:可以用它创建命名空间,只要把自己所有的代码都写在这个特殊的函数包装内,那么外部就不能访问,除非你允许(变量前加上window,这样该函数或变量就成为全局)。各JavaScript库的代码也基本是这种组织形式。 常见形式: (function () { /* code */ } ()); !function () { /* code */ } (); ~function () { /* code */ } (); -function () { /* code */ } (); +function () { /* code */ } (); function(){ /* code */}();
相关文章推荐
- 简要解读Ruby面向对象编程中的作用域
- JavaScript 学习笔记之变量及其作用域
- 聊一聊JavaScript作用域和作用域链
- 深入理解javascript作用域和闭包
- javascript作用域和闭包使用详解
- 深入浅析JavaScript中的作用域和上下文
- 关于JavaScript作用域你想知道的一切
- JavaScript中最容易混淆的作用域、提升、闭包知识详解(推荐)
- 深入理解Javascript作用域与变量提升
- 跟我学习javascript的作用域与作用域链
- 深入理解Javascript中this的作用域
- JavaScript 变量、作用域及内存
- JavaScript修改作用域外变量的方法
- 深入理解js函数的作用域与this指向
- Javascript学习笔记之函数篇(六) : 作用域与命名空间
- Javascript中作用域的详细介绍
- JavaScript作用域示例详解
- 深入浅析javascript中的作用域(推荐)
- javascript作用域、作用域链(菜鸟必看)
- JS中作用域和变量提升(hoisting)的深入理解