JavaScript的闭包
变量的作用域:
每个函数来定义作用域,函数内部用var来声明的,他们的作用域只在本函数内有用。函数可以用来创造函数作用域。此时的函数像一层半透明的玻璃,在函数里面可以看到外面的变量,而在函数外面无法看到函数里的变量。
我们先来看一个例子,在例子中我们定义了三个函数,分别是funa ,funb,func,在每个函数里我们都用 var 独自声明了一个变量,然后进行打印。(代码)
var funa = function(){ var a = "sakura"; console.log("I am "+a); } var funb =function(){ var b = "naruto"; console.log("I am "+b); } var func= function(){ var c= "sasuke"; console.log("I am "+c); } funa(); funb(); func();
这时我们用node 运行程序是没有问题的!但是如果我们钥匙把变量 a ,在funb 函数里打印,程序就会报错.(代码如下)
var funb =function(){ var b = "naruto"; console.log("I am "+b); console.log(a); }
如果这个例子我们理解了,那我们再来看一个更为复杂的例子。例子里先定义了 func1 函数,然后又在 func1 函数里定义了 func2 ,然后再func1里打印func2里的一个变量,这时是找不到变量的,程序会报错。
var a = 1; var func1= function(){ var b=2; var func2 = function(){ var c= 3; console.log(b);//可以找到 console.log(a);//可以找到 } func2(); //下面的c是找不到的。 console.log(c); } func1();
简单的闭包函数
var func = function(){ var a=1; return function(){ a++; console.log(a); } }; var f = func(); f(); f(); f();
通过返回一个函数,带出了上下文,让 a 变量可以对外暴露了。
我们再看下边这个代码,这时控制台打印的结果是什么那?
function Foo() { var i = 0; return function() { console.log(i++); } } var f1 = Foo(), f2 = Foo(); f1(); f1(); f2();
答案是:0 1 0
经典案例:在循环时需要经常的用到闭包的知识。
html代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset ="UTF-8"> <title>VueJS</title> <link rel="stylesheet" href="./bower_components/bootstrap/dist/css/bootstrap.css"> <link rel="stylesheet" href="./bower_components/bootstrap/dist/css/bootstrap-theme.css"> </head> <body> <div class="container"> <div class="row"> <div class="col-md-3"> <hr> <div class="panel panel-info"> <div class="panel-heading"> <h3 class="panel-title">闭包经典实例</h3> <div> <div class="panel-body"> <ul class="list-group"> <li class="list-group-item">1</li> <li class="list-group-item">2</li> <li class="list-group-item">3</li> <li class="list-group-item">4</li> <li class="list-group-item">5</li> </ul> </div> </div> </div> </div> </div> <script src="./scopedemo4.js"></script> </body> </html>
var nodes = document.getElementsByTagName('li'); for(var i=0,len = nodes.length; i<len; i++){ (function(i){ nodes[i].onclick = function(){ console.log(i); }; })(i) }
//根据闭包的原理将每一个li标签绑定上事件;