您的位置:首页 > Web前端 > JavaScript

JS闭包

2016-12-15 00:00 399 查看
摘要: js中关于闭包

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 */}();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JS闭包 作用域