• Javascript,闭包


    js变量的调用

    一、全局变量函数调用

    var n = 99;
    function f1() {
    alert(n);
    }
    f1();//99

    在函数外部定义的变量,再函数中可以被调用,因为变量n,与f1在同一个域下。

    二、内部变量函数错误调用

    function f1() {
    var n = 99;
    }
    alert(n);//错误

    变量n在函数f1中,所以在外部得不到n的值;n与f1不是平级的。

    三、不带var的变量默认为全局变量

    function f1() {
    n = 99;
    }
    f1();
    alert(n);//9

    js中默认不带var修饰符的自动成为全局变量,在当前window的任何地方都可以调取到。

    四、外部读取局部变量

    function f1() {
    var n = 99;
    function f2() {
    alert(n);
    }
    return f2;
    }
    var result = f1();
    result();//99

    内部变量想要在外部使用,这时就用到了闭包。

    五、闭包公式例子

    function f1() {
    var n = 999;
    nAdd = function () { n += 1 };

    function f2() {
    alert(n);
    }

    return f2;
    };

    var result = f1();

    result();//999

    nAdd();

    result();//1000

    闭包的用途(1、读取函数内部的变量;2、让变量的值始终保持在内存中)

    六、变量作用于this应用

    var name = 'the window';
    var obj = {
    name: 'my obj',
    getNameFunc: function () {
    return function () {
    return this.name;
    };
    }
    };

    alert(obj.getNameFunc()());//the window

    通过闭包,函数内部的函数为全局服务。

    var name = 'the window';
    var obj = {
    name: 'my obj',
    getNameFunc: function () {
    var that = this;
    return function () {
    return that.name;
    };
    }
    };

    alert(obj.getNameFunc()());//my obj

    另一简单应用:

    <a onclick="touchThis(this)" href="javascript:touchThis(this)" ></a>

    七、var和this不是一回事

    var w = 100;
    function f1() {
    //var w=101;
    //this.w=102;
    function f2() {
    document.write(this.w);
    }
    return f2;
    }
    f1()();
    //输出:100


    var w = 100;
    function f1() {
    var w = 101;
    //this.w=102;
    function f2() {
    document.write(this.w);
    }
    return f2;
    }
    f1()();
    //输出:100


    var w = 100;
    function f1() {
    w = 101;
    //this.w=102;
    function f2() {
    document.write(this.w);
    }
    return f2;
    }
    f1()();
    //输出:101


    var w = 100;
    function f1() {
    //var w=101;
    this.w = 102;
    function f2() {
    document.write(this.w);
    }
    return f2;
    }
    f1()();
    //输出:102

    1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

    2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

  • 相关阅读:
    人脸识别完整项目实战(1):目录大纲篇
    《分布式数据仓库最佳实践》学员答疑实录(2)
    知识图谱完整项目实战(附源码)(3)
    人脸识别完整项目实战(14):实时人脸特征点标定程序设计
    知识图谱完整项目实战(附源码)(2)
    sqlserver查询数据表中每个分类最新的一条记录
    WPF datagrid combobox 使用枚举
    中控考勤机开发-专业性门禁终端
    临时保存
    开源WPF控件库MaterialDesignInXAML推荐
  • 原文地址:https://www.cnblogs.com/mafacai/p/4925088.html
Copyright © 2020-2023  润新知