• js闭包


    一、从外部读取方法内部的局部变量

    <script type="text/javascript">
    function func(){
        var a = 22;
    
        function func2(){
            alert(a++);
        }
    
        return func2;
    }
    
    var result = func();
    result();                //22
    result();                //23
    
    </script>

    二、闭包的概念

    各种专业文献上的“闭包”(closure)定义非常抽象,很难看懂。我的理解是,闭包就是能够读取其他函数内部
    变量的函数。
    由于在Javascript 语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个
    函数内部的函数”。
    所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

    三、闭包的用途

    一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

    四、闭包的使用注意点

    1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性
    能问题,在IE 中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
    2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包
    当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随
    便改变父函数内部变量的值。
    <script type="text/javascript">
    var name = 'Window';
    var object = {
        name: 'MyObject',
        getName:function(){
            return function(){
                return this.name;
            }
        }
    };
    
    alert(object.name);                //MyObject
    alert(object.getName()());        //Window
    
    </script>

    疑问:上述中为什么第二个弹出window呢?  这时候this指向的是window,所以this.name就是全局window上的name,就是Window了。

    看下面这个例子:

    <script type="text/javascript">
    var a = {
        b:function(){
            console.log(this);
        },
        c:console.log(this)
    }
    
    //第一种  this指的是a
    a.b();
    
    //第二种 this指的是window
    var cc = a.b;
    cc();
    
    </script>

    解释:

    1.b方法中的this要看你的调用方式,如果直接a.b(),这样的话this指向调用b的这个对象,也就是a,这属于方法调用;
    2.如果你通过var d = a.b; d(),这时this就指向window,这属于函数调用了,它的执行环境就是window,所以指向它。
    3.而c中的this指向window,它的执行环境就是window,输出的window来自它;
    4.通过addEventListener给元素绑定事件,this指向绑定这个事件的元素。

    javascript一共有4种调用方式,题主举的例子是使用方法调用模式,方法调用模式中的this被绑定到对象上。

    详情可以参见:JavaScript 中this在不同调用模式中的差异

  • 相关阅读:
    面向对象
    linux下apache重启报错
    mysql登录密码忘记怎么办?
    html基础知识梳理
    用js实现贪吃蛇
    简单轮播图案例
    JavaScript基础学习笔记整理
    读书笔记之《Redis开发与运维》—— 三
    读书笔记之《Redis开发与运维》—— 二
    读书笔记之《Redis开发与运维》—— 一
  • 原文地址:https://www.cnblogs.com/tenWood/p/9053706.html
Copyright © 2020-2023  润新知