温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

JS闭包

发布时间:2020-07-10 18:04:57 来源:网络 阅读:371 作者:wx5d13575cbfad1 栏目:web开发

JS作用域

JS的作用域可以分为全局作用域和局部作用域,全局变量可以在所有的脚本和函数中使用,而如果变量在函数中声明的,则称为局部作用域,局部作用域只能在函数内部访问


1: 全局变量

<script>

var carName = " Volvo"; 

// 此处可调用 carName 变量 

function myFunction() { 

    // 函数内可调用 carName 变量 

}
</script>

2:局部变量:

        <script>
     // 此处不能调用 carName 变量 
     function myFunction() { 
     var carName = "Volvo"; 
     // 函数内可调用 carName 变量 
     }
    </script>

JS闭包
我们说函数中定义的局部变量只能在函数中起作用,但是通过闭包可以将使函数使用别的函数中的局部变量,但是闭包会大量占用内存 会导致网页内存泄露 ---所以一般尽量避免使用闭包
实例:

function f1(){
        var a=10;
        return a;
    }
    function f2(){
        console.log(f1());
    }
    f2();

上面实例中函数2中可以调用函数1中的变量a,输出结果为10.
接下来举一些函数方面的实例,方便更好的理解
1:

     <script>
     function f1(){
         var  a=1;
             var t=function(){
             a++;
             }
             return function(){
              console.log(a);
             }
             }
             var b=f1()
             b();//a=1
             t();
             b();//a=2
             t();
             b();//a=3
     </script>

因为t()函数是匿名函数,没有调用不会自己执行,所以当第一次调用f1()函数时,t()函数不执行,当t()执行后,a自加1,返回a等于2,于是第二次调用的时候就会得到a=2的结果,之后同理;而如果把调用函数改为

 var a1=f1();
a1();//1
t();
var a2=f1();  //重新执行一遍
a2()//1

刚开始做这道题的时候,以为a2()中得到的结果是a=2,但是当重新定义var a2=f1()时,函数也会重新初始化,所以就算之前执行过一次t()函数,在重新初始化后与a2无关。
2:

    var temp = "object";
(function () {
    console.log(temp);//undefined    //提前声明
    var temp = "student";
    console.log(temp);//student
})();

这道题在我开始做的时候很难理解,第一个temp为什么会是undefinde一直纠结了很久,object是一个全局变量,而student则是函数中的一个局部变量,当在函数中调用student的时候会覆盖object,又因为函数中的变量可以被提前声明,本题就相当于

var temp = "object";
   (function () {
         var  temp;
       console.log(temp);//undefined    //提前声明
    var temp = "student";
    console.log(temp);//student
})();

所以第一个console.log(temp )的结果就为undefined,第二个的结果就为student

3:

 function f1() {
    var n = 999;
    return function f2() {
        return n;
    }
    }
   console.log(f1()());//999
  console.log(f1());//返回return后面的一堆

4:

(1)  var name="global";
              function foo(){
              console.log(name);
               }
              function fooOuter1(){
               var name="local";
               foo();
                 }
              fooOuter1();//global 

     (2)var name="global";
              function fooOuter2(){
                            console.log(name);//undefined
               var name="local";
                function foo(){
                    console.log(name);//local    局部函数取就近
                 }
                foo();
              }
              fooOuter2();//local

这两个题很相近,但因为作用域的不同结果截然相反,第一个题中因为函数中的变量作用域只能作用在本函数中,而不能作用到其他函数中 ,所以在fooOuter1中调用foo函数,foo无法调用fooOuter1中的变量,只能调用全局变量。而如果把题1换一个形式,用闭包,则得到结果为local

      var name="global";
                function foo(){
                var name="local";
                console.log(name);
                }
                function fooOuter(){
                foo();
                }
                fooOuter()//返回结果为local

而在题二中,因为是在函数体中调用,函数体中的local会覆盖global,所以会先调用local

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI