GVKun编程网logo

JS闭包的理解(js闭包的理解阮一峰)

28

针对JS闭包的理解和js闭包的理解阮一峰这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展JavaScript学习之什么是闭包?js闭包的介绍、JS闭包的理解、js中闭包的定义是什么?js闭包

针对JS闭包的理解js闭包的理解阮一峰这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展JavaScript学习之什么是闭包?js闭包的介绍、JS 闭包的理解、js中闭包的定义是什么?js闭包的应用场景、Js函数闭包的理解及闭包存在一些问题的解决等相关知识,希望可以帮助到你。

本文目录一览:

JS闭包的理解(js闭包的理解阮一峰)

JS闭包的理解(js闭包的理解阮一峰)

先从闭包特点解释,应该更好理解.

闭包的两个特点:

1、作为一个函数变量的一个引用 - 当函数返回时,其处于激活状态。
2、一个闭包就是当一个函数返回时,一个没有释放资源的栈区。

其实上面两点可以合成一点,就是闭包函数返回时,该函数内部变量处于激活状态,函数所在栈区依然保留.

我们所熟知的主流语言,像C,java等,在函数内部只要执行了return,函数就会返回结果,然后内存中删除该函数所在的区域.生命周期也就停止了.一般的js函数也是这样.
但是有闭包特性的js函数有点特殊.
就例子来说:
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c = a();
c();

这是个标准的闭包.在函数a中定义了函数b,a又return了b的值.这些可以先不管.
var c = a();
c();
这两句执行很重要.
在var c = a();这行里,执行了a函数,那么肯定a经过了return.按照主流语言的函数特性,现在c的值就是a的返回值.
第二行c()的执行实际执行的就是b函数.最后不管执行的是谁,会弹出一个值为1的窗口,到此为止,所有的生命周期按理论来说就算全部结束了.
可是,如果我们再多执行一行.
var c = a();
c();
c();
第一次弹出1,第二次执行却弹出了2.

也就是说,第一次c()后,a中的i依然保留.自然a在内存的栈区依然保留.

a是return过了,但是,a及内部值却依然存在,这就是闭包.

好了,总结下,
1,闭包外层是个函数.
2,闭包内部都有函数.
3,闭包会return内部函数.
4,闭包返回的函数内部不能有return.(因为这样就真的结束了)
5,执行闭包后,闭包内部变量会存在,而闭包内部函数的内部变量不会存在.

闭包的应用场景(呵呵,复制的参考资料)
1、保护函数内的变量安全。以最开始的例子为例,函数a中i只有函数b才能访问,而无法通过其他途径访问到,因此保护了i的安全性。
2、在内存中维持一个变量。依然如前例,由于闭包,函数a中i的一直存在于内存中,因此每次执行c(),都会给i自加1。

根据参考资料的应用场景,我们会自然的想到java或是c++的类.虽然JS没有类的概念,但是有了类的相似执行结果.

另外,还有一种格式颇受争议:
(function(a,b))(a,b);
如果你使用过jquery,并且观察过他的代码,你就会很奇怪他的写法,网上有人也把这种格式叫做闭包.

JavaScript学习之什么是闭包?js闭包的介绍

JavaScript学习之什么是闭包?js闭包的介绍

本篇文章就给大家带来javascript学习之什么是闭包?js闭包的介绍。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。

什么是闭包? 

官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

闭包的特点:

立即学习“Java免费学习笔记(深入)”;

1.作为一个函数变量的一个引用,当函数返回时,其处于激活状态。
2.一个闭包就是当一个函数返回时,一个没有释放资源的栈区。

简单的说,javascript允许使用内部函数---即函数定义和函数表达式位于另一个函数的函数体内。

而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。

当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。

闭包就是一个可访问到别的函数作用域中变量的函数。

一个函数包含另一个函数,内部函数使用外部函数的变量或者参数。

闭包可以使一个局部的变量或者参数不会被回收,以便我们长期的使用。

nbsp;html>


	
		<meta><title>Insert title here</title><script></script><script>
		//平常创建的方式
		//一个函数包含另一个函数,内部函数使用外部函数的变量或者参数。
		function myFunction() {
			var x = 10;
			return function() {
				x++;
				alert(x);
			}
		}
		var a = myFunction();
		a(); //11    a(); //12    a(); //13
		//闭包可以使一个局部的变量或者参数不会被回收,以便我们长期的使用。
	</script>
登录后复制

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。更多相关教程请访问JavaScript视频教程,jQuery视频教程,bootstrap教程!

以上就是JavaScript学习之什么是闭包?js闭包的介绍的详细内容,更多请关注php中文网其它相关文章!

JS 闭包的理解

JS 闭包的理解

先写一个简单闭包函数

function A(){
var str =''hello world'' function B(){ alert(str
); } return B; } var C = A(); C();// Helloworld!

这个闭包函数的执行过程为

1、定义普通函数 A

2、在 A 函数内部定义 普通函数 B

3、在 A 函数中返回 B

4、执行 A ,并把 A 返回的结果赋值给变量 C

5、执行 C

总结起来就是:

函数A的内部函数B被函数A外的一个变量 c 引用。

那么闭包的定义就就是:

有权访问另一个函数内部变量的函数(当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包。) 

 JS 的链式作用域:

子对象会一级一级向上寻找所有父对象的变量,反之不行。
js中函数内部可以读取全局变量,函数外部不能读取函数内部的局部变量。

 

注意!闭包和内存泄漏和内存回收之间的关系

内存回收:avaScript是一种具有垃圾回收机制的语言——对象在创建时分配内存,当一个对象不再被引用的时候,这个对象就会被浏览器回收,

否则这个对象就会一直保存在内存中。

 内存泄漏是指我们已经无法再通过js代码来引用到某个对象,但垃圾回收器却认为这个对象还在被引用,因此在回收的时候不会释放它。

致了分配的这块内存永远也无法被释放出来。如果这样的情况越来越多,会导致内存不够用而系统崩溃。

在上述例子中,B 定义在 A 中,因此 B 依赖于 A ,而外部变量 C 又引用了 B , 所以A间接的被 C 引用,所以C不会被垃圾回收机制回收。

 

也就是说,A 不会被 GC 回收,会一直保存在内存中。

上述例子进行改进

function A() {
    var count = 0;
    function B() {
       count ++;
       console.log(count);
    }
    return B;
}
var C = A();
C();// 1
C();// 2
C();// 3

count 是函数A 中的一个变量,它的值在函数B 中被改变,函数 B 每执行一次,count 的值就在原来的基础上累加 1 。因此,函数A中的 count 变量会一直保存在内存中。

当我们需要在模块中定义一些变量,并希望这些变量一直保存在内存中但又不会 “污染” 全局的变量时,就可以用闭包来定义这个模块

 

js中闭包的定义是什么?js闭包的应用场景

js中闭包的定义是什么?js闭包的应用场景

本篇文章给大家带来的内容是关于js中闭包的定义是什么?js闭包的应用场景,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

什么是闭包

闭包是指有权访问另一个函数作用域中的变量的函数。

function createFunc() {
    var name = "wheeler";
    return function () {
        return name;
    }
}

var nameFunc = createFunc();  // nameFunc是一个闭包

var name = nameFunc();

console.log(name);

// 解除对匿名函数的应用(以便释放内存)
nameFunc=null;
登录后复制

内部函数可以访问外部函数的变量name,内部函数的作用域包含了外部函数的作用域
(由于闭包会携带包含它的函数的作用域,可能导致内存占用过多,因此谨慎使用闭包)

可以通过模仿块级作用域减少闭包导致的内存占用过多

// 块级作用域(通常称为私有作用域)的匿名函数的语法
(function(){
    // 块级作用域
})();
登录后复制

将闭包定义在块级作用域里面

// 可以减少闭包占用的内存问题,因为没有指向匿名函数的引用。只要函数执行毕,就可以立即销毁其作用域链了
(function(){
    function createFunc() {
        var name = "wheeler";
        return function () {
            return name;
        }
    }

    var nameFunc = createFunc();

    var name = nameFunc();

    console.log(name);
})();
登录后复制

闭包的应用场景

  • 用闭包模拟私有方法

var returnNum = (function () {
    var num = 0;

    function changeNum(value) {
        num = value;
    }

    return {
        add: function () {
            changeNum(10);
        },
        delete: function () {
            changeNum(-10);
        },
        getNum: function () {
            return num;
        }
    }
})();

// 闭包
console.log(returnNum.getNum());
returnNum.add();
console.log(returnNum.getNum());
returnNum.delete();
console.log(returnNum.getNum());
登录后复制
  • 缓存

var CacheCount = (function () {
    var cache = {};
    return {
        getCache: function (key) {
            if (key in cache) {// 如果结果在缓存中
                return cache[key];// 直接返回缓存中的对象
            }
            var newValue = getNewValue(key); // 外部方法,获取缓存
            cache[key] = newValue;// 更新缓存
            return newValue;
        }
    };
})();

console.log(CacheCount.getCache("key1"));
登录后复制
  • 封装

var person = function(){
    var name = "default";//变量作用域为函数内部,外部无法访问
    return {
        getName : function(){
            return name;
        },
        setName : function(newName){
            name = newName;
        }
    }
}();

console.log(person.name);// undefined
console.log(person.getName());
person.setName("wheeler");
console.log(person.getName());
登录后复制
  • setTimeout

function func(param) {
    return function() {
        console.log(param);
    }
}
var myFunc = func(''wheeler'');
setTimeout(myFunc, 1000);
登录后复制
  • 保护函数内的变量安全。

  • 在内存中维持一个变量。

相关推荐:

js闭包是什么?对js闭包的理解(附代码)

js闭包是什么?对js闭包的理解

以上就是js中闭包的定义是什么?js闭包的应用场景的详细内容,更多请关注php中文网其它相关文章!

Js函数闭包的理解及闭包存在一些问题的解决

Js函数闭包的理解及闭包存在一些问题的解决

函数闭包

  • 函数就是闭包,当一个函数被创建时,它的内部的语句、变量、函数等,共同形成了闭包。

    这里简单分析下闭包函数执行调用过程
  function outer(){   var a = 12;   //形成闭包环境中的变量不是一成不变的,可以被更改   function inner(){   console.log(a ++);   }   return inner;   }  ​   var inn = outer();   inn();   inn();

闭包的用途:

可以在函数外部读取函数内部成员

让函数内成员始终存活在内存中

闭包存在的问题

 //闭包的问题  var arr = [];  for(var i =.........

我们今天的关于JS闭包的理解js闭包的理解阮一峰的分享已经告一段落,感谢您的关注,如果您想了解更多关于JavaScript学习之什么是闭包?js闭包的介绍、JS 闭包的理解、js中闭包的定义是什么?js闭包的应用场景、Js函数闭包的理解及闭包存在一些问题的解决的相关信息,请在本站查询。

本文标签: