闭包

2020-08-13  本文已影响0人  MISS_3ca2
闭包可以让你从内部函数访问外部函数作用域,在javascript中每当函数被创建,就会在函数生成时生成闭包
function init (){
   var name = '小明'; //name 是一个被 init 创建的局部变量
   function displayName(){ // displayName() 是内部函数,一个闭包
         console.log(name) // 使用了父函数中声明的变量
    }
    displayName()
}
init()
function init2(){
            var age = 20;
            function displayAge(){
                console.log(age);
            }
            return displayAge;
        }
        init2()();
从本质上讲 makeadd是一个工厂函数 创建了将指定的值和他的参数相加求和的函数
function makeadd(x){
            return function(y){
                return x+y
            }
        }

        var add5 = makeadd(5);
        var add6 =  makeadd(6);
        console.log(add5(4))
        console.log(add6(2))
Counter1 和 Counter2是各自独立的 每个闭包都是引用自己词法作用域内的变量privateCounter
每次调用其中一个计数器时,通过改变这个变量的值,会改变这个闭包的词法环境,然而在一个闭包内对变量的修改,不会影响另一个闭包中的变量
var makeCounter = function() {
            var privateCounter = 0;
            function changeBy(val) {
                privateCounter += val;
            }
            return {
                increment: function() {
                    changeBy(1);
                },
                decrement: function() {
                    changeBy(-1);
                },
                value: function() {
                    return privateCounter;
                }
            }  
        };

        var Counter1 = makeCounter();
        var Counter2 = makeCounter();
        console.log(Counter1.value()); /* logs 0 */
        Counter1.increment();
        Counter1.increment();
        console.log(Counter1.value()); /* logs 2 */
        Counter1.decrement();
        console.log(Counter1.value()); /* logs 1 */
        console.log(Counter2.value()); /* logs 0 */

创建一个可以无限次调用的闭包函数

function a(){
            var i = 10;
            return function b(){
                console.log(i)
                return b
            }
            
        }
       console.log(a()()()()()()()) 
上一篇 下一篇

猜你喜欢

热点阅读