码迷,mamicode.com
首页 > 其他好文 > 详细

对于闭包的一些理解

时间:2016-03-10 21:53:14      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

对于闭包的理解首先需要对作用域的进行了解,其中最重要的一点是对于JS函数运行在它们被定义的作用域里而不是被执行的作用域里: function f1() {

function f1() {
  var a = 1;
  f2();
  function f2() {
    alert(a);
  }
}
f1();代码一

 

function f1() {
  var a = 1;
  f2();
}
function f2() {
  alert(a);
}
f1();代码二

代码一显示a=1,代码二显示a未定义。

闭包:指外部函数无法获得内部函数的值,但内部函数的下一级可以获得并返回。

一.关于this:举连个例子:

1.

function Hero(name) {
    	this.name = name;
}
var h = Hero("pcd");
var h = new Hero("pcd");

不使用new时,h值为该函数的返回值,为undefined,this指向全局变量window。

但创建一个对象时,this指向这个对象。

2.

var name = "The Window";
var object = {
  name: "My Object",
  getNameFunc: function() {
    return function() {
      return this.name;
    }
  }
}
console.log(object.getNameFunc()());

 

var name = "The Window";
var object = {
  name: "My Object",
  getNameFunc: function() {
    var that = this;
    return function() {
      return that.name;
    }
  }
}
console.log(object.getNameFunc()());

当函数被作为某个对象的方法调用时,this指向那个对象,在全局函数中this等于window。

 

二.

function fun(n,o) {
  console.log(o)
  return {
    fun:function(m){
      return fun(m,n);
    }
  };
}
var a = fun(0);  a.fun(1);  a.fun(2);  a.fun(3);//undefined,?,?,?
var b = fun(0).fun(1).fun(2).fun(3);//undefined,?,?,?
var c = fun(0).fun(1);  c.fun(2);  c.fun(3);//undefined,?,?,?

答案为:

技术分享
//答案:
//a: undefined,0,0,0
//b: undefined,0,1,2
//c: undefined,0,1,1
View Code

题目详解链接:http://www.cnblogs.com/xxcanghai/p/4991870.html

三.模拟块级作用域

javascript内有块级作用域,例:

if(true) {
    var color = "blue";
}

console.log(color);//blue

for (var i=0; i < 5; i++){
    console.log(i);
}

console.log(i);//5

在函数中造成在存在该值,例:

function outputNumbers(count){
    for (var i=0; i < count; i++){
        console.log(i);
    }            
    console.log(i);   //count
}

outputNumbers(5);    

为了使outputNumbers()中的其他地方不在有i值,将其放入模拟块级作用域中

function outputNumbers(count){
	(function() {
		for (var i=0; i < count; i++){
        	  console.log(i);
    	     }
	})();
     
    console.log(i);   //错误
}

则在outputNumbers()中的其他地方不存在有i值。

四.内存泄露

 

对于闭包的一些理解

标签:

原文地址:http://www.cnblogs.com/pcd12321/p/5263420.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!