javascript 闭包

首先,先聊一下作用域的问题

  1. 全局变量 是可以被所有的函数访问的
  2. 局部变量是函数的内部变量,只能在函数内部被访问(这是我写的,写的时候去百度了下,觉得下面一句更准确)

                 变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。

这里就有局限性了,如果我在函数外部,想去访问一个函数的内嵌函数或者函数的内部变量怎么办??

目前我理解的闭包的作用就是这样的,闭包是指有权限访问另一个函数作用域的变量的函数

创建全局变量,将内部函数赋给全局变量,通过全局变量调用内部函数

var globalVar;
        function outerFn() {
            document.write("Outer function<br/>");          
            function innerFn() {
                document.write("Inner function<br/>");
            }
            globalVar = innerFn;
        }
        outerFn();
        globalVar();

将内部函数通过return返回给变量,因而调用内部函数
function outerFn() { document.write(
"Outer function<br/>"); function innerFn() { document.write("Inner function<br/>"); } return innerFn; } var fnRef = outerFn(); fnRef();

然后就存在另外的问题了,变量的问题,不同位置的变量存活多久

function outerFn() {
            document.write("Outer function<br/>");
            function innerFn() {
                var innerVar = 0;//内部函数的变量
                innerVar++;
                document.write("Inner function	");
                document.write("innerVar = "+innerVar+"<br/>");
            }
            return innerFn;
        }
        var fnRef = outerFn();
        fnRef();
        fnRef();
        var fnRef2 = outerFn();
        fnRef2();
        fnRef2();

内部函数的变量,不论引用多少次,每一次都是重新创建

Outer function
Inner function    innerVar = 1
Inner function    innerVar = 1
Outer function
Inner function    innerVar = 1
Inner function    innerVar = 1

全局变量,每次引用globalVar都会递增

var globalVar = 0;
        function outerFn() {
            document.write("Outer function<br/>");
            function innerFn() {
                globalVar++;
                document.write("Inner function	");
                document.write("globalVar = " + globalVar + "<br/>");
            }
            return innerFn;
        }
        var fnRef = outerFn();
        fnRef();
        fnRef();
        var fnRef2 = outerFn();
        fnRef2();
        fnRef2();
Outer function
Inner function    globalVar = 1
Inner function    globalVar = 2
Outer function
Inner function    globalVar = 3
Inner function    globalVar = 4

但是如果这个变量是父函数的局部变量又会怎样呢?因为内部函数会引用到父函数的作用域(有兴趣可以了解一下作用域链和活动对象的知识),内部函数也可以引用到这些变量

function outerFn() {
            var outerVar = 0;
            document.write("Outer function<br/>");
            function innerFn() {
                outerVar++;
                document.write("Inner function	");
                document.write("outerVar = " + outerVar + "<br/>");
            }
            return innerFn;
        }
        var fnRef = outerFn();
        fnRef();
        fnRef();
        var fnRef2 = outerFn();
        fnRef2();
        fnRef2();
Outer function
Inner function    outerVar = 1
Inner function    outerVar = 2
Outer function
Inner function    outerVar = 1
Inner function    outerVar = 2

通过每个引用调用innerFn都会独立的递增outerVar。也就是说第二次调用outerFn没有继续沿用outerVar的值,而是在第二次函数调用的作用域创建并绑定了一个一个新的outerVar实例,两个计数器完全无关。

引用:http://www.cnblogs.com/dolphinX/archive/2012/09/29/2708763.html#undefined

 

原文地址:https://www.cnblogs.com/html-css-js/p/7483528.html