javascript闭包函数的基本使用以及会遇到的问题解决

本篇文章给大家带来的内容是关于javascript闭包函数的基本使用以及会遇到的问题解决,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

面试的时候一直会被问到什么是闭包,以前也不是很在意,更没有去总结和归纳.

闭包就是能够读取其他函数内部变量的函数。
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

(一)闭包最基本的应用:

少废话,上代码还是<>的栗子,

登录后复制登录后复制

function createComparisonFunction(propertyName) {    return function(object1, object2) {        var value1 = object1[propertyName];        var value2 = object2[propertyName];        if(value1  value2) {            return 1;        } else {            return 0;        }    };}var compare = createComparisonFunction("name"); var result = compare({ name: "Nicholas" }, { name: "Greg" });

登录后复制登录后复制

分析:
(1)闭包函数可以访问其外部函数
  return出来的这个匿名函数就是一个闭包函数,这个匿名函数中的访问了外部函数的活动对象,就是这个propertyName参数。因为外部的作用域链被这个匿名函数所包含(也可以理解为:compare函数包含
createComparisonFunction()函数的活动对象和全局变量对象),所以返回的这个匿名函数可以一直访问他外部的这个propertyName以及全局变量。
(2)闭包所引用的外部变量不会因为所在作用域销毁而销毁
  因为在返回的闭包函数中,引用了外部函数的活动对象,所以createComparisonFunction()内的活动对象(即propertyName)在createComparisonFunction()执行完后不会被销毁。因为虽然createComparisonFunction执行完后,会把其执行环境中的作用域链销毁,但是他的活动对象仍然被闭包函数引用,放入了匿名函数的执行环境的作用域中

立即学习“Java免费学习笔记(深入)”;

(二)闭包的副作用

(1).闭包只能取得包含函数中任何变量的最后一个值

        function createFunctions(){             var result = new Array();             for (var i=0; i < 10; i++){                 result[i] = function(){                 return i;                 };             }             return result;         }                var res = createFunctions();        console.log(res[0]());  //10        console.log(res[1]());  //10

登录后复制登录后复制

原理:
因为每个函数的作用域链中都保存着 createFunctions() 函数的活动对象,所以它们引用的都是同一个变量 i 。 当createFunctions()函数返回后,变量 i 的值是 10,此时每个函数都引用着保存变量 i 的同一个变量对象,所以在每个函数内部 i 的值都是 10

解决方法:

获取内部函数的对象result[i]时,使用匿名函数,并在匿名函数中再使用闭包函数,使得当前环境下的num被闭包函数函数调用,存储在作用域中不会被释放.

登录后复制登录后复制

        function  createFunctions2(){            var result  = new Array();            for(var i = 0 ; i <10 ; i++){                result[i] = (function(num){                    return function(){                        return num                    }                })(i)            }            return result;        }                var res2 =  createFunctions2();        console.log(res2[0]());  // 0         console.log(res2[1]());  // 1

登录后复制登录后复制

原理:
定义了一个匿名函数,并将立即执行该匿名函数的结果赋给数组。这里的匿名函数有一个参数 num,也就是最终的函数要返回的值。在调用每个匿名函数时,我们传入了变量 i。由于函数参数是按值传递的,所以就会将变量 i 的当前值复制给参数 num。而在这个匿名函数内部,又创建并返回了一个访问 num 的闭包。这样一来,result 数组中的每个函数都有自己num 变量的一个副本,因此就可以返回各自不同的数值了。

(2).当闭包函数外部包含了一个匿名函数,this指向全局

        var name = "The Window";        var object = {            name: "My Object",            getNameFunc: function () {                   return function () {        //匿名函数执行具有全局性                    return this.name;       //this指向window                };            }        };        console.log(object.getNameFunc()())  //  The Window

登录后复制登录后复制

原理:
每个函数在被调用时都会自动取得两个特殊变量:this 和 arguments。内部函
数在搜索这两个变量时,只会搜索到其活动对象为止,所以无法获取到外部的this,此时getNameFunc()返回的是一个匿名函数,并且匿名函数具有全局性,因此this指向全局的window

解决方案:
把外部作用域中的 this 对象保存在一个闭包能够访问到的变量里,就可以让闭包访问该对象了

    var name2 =  "The  Window";    var object2 = {        name:"My Object",        getNameFunc:function(){            var that =  this; //将外部函数的this保存在外部函数的活动对象中(函数中申明的变量中)            return function (){                return that.name            }        }    }        console.log(object2.getNameFunc()())   //My Object

登录后复制登录后复制

(三)
闭包的缺点
(1).由于闭包会携带包含它的函数的作用域,因此会比其他函数占用更多的内存。过度使用闭包可能会导致内存占用过多
(2).闭包只能取得包含函数中任何变量的最后一个值,所以要注意写法

专栏

文章详情

唧唧陆                                                                                                javascript闭包函数的基本使用以及会遇到的问题解决3                                                                                                                                                                                                                                                                                                                                                            

                                                   3 分钟前发布                                                                                            

闭包函数

javascript

                                               7 次阅读                                                 ·                                                 读完需要 12 分钟                                                                                    

                           0                        

                                                                                                                                           

面试的时候一直会被问到什么是闭包,以前也不是很在意,更没有去总结和归纳.

闭包就是能够读取其他函数内部变量的函数。
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

(一)闭包最基本的应用:

少废话,上代码还是<>的栗子,

登录后复制登录后复制

function createComparisonFunction(propertyName) {    return function(object1, object2) {        var value1 = object1[propertyName];        var value2 = object2[propertyName];        if(value1  value2) {            return 1;        } else {            return 0;        }    };}var compare = createComparisonFunction("name"); var result = compare({ name: "Nicholas" }, { name: "Greg" });

登录后复制登录后复制

分析:
(1)闭包函数可以访问其外部函数
  return出来的这个匿名函数就是一个闭包函数,这个匿名函数中的访问了外部函数的活动对象,就是这个propertyName参数。因为外部的作用域链被这个匿名函数所包含(也可以理解为:compare函数包含
createComparisonFunction()函数的活动对象和全局变量对象),所以返回的这个匿名函数可以一直访问他外部的这个propertyName以及全局变量。
(2)闭包所引用的外部变量不会因为所在作用域销毁而销毁
  因为在返回的闭包函数中,引用了外部函数的活动对象,所以createComparisonFunction()内的活动对象(即propertyName)在createComparisonFunction()执行完后不会被销毁。因为虽然createComparisonFunction执行完后,会把其执行环境中的作用域链销毁,但是他的活动对象仍然被闭包函数引用,放入了匿名函数的执行环境的作用域中

立即学习“Java免费学习笔记(深入)”;

(二)闭包的副作用

(1).闭包只能取得包含函数中任何变量的最后一个值

        function createFunctions(){             var result = new Array();             for (var i=0; i < 10; i++){                 result[i] = function(){                 return i;                 };             }             return result;         }                var res = createFunctions();        console.log(res[0]());  //10        console.log(res[1]());  //10

登录后复制登录后复制

原理:
因为每个函数的作用域链中都保存着 createFunctions() 函数的活动对象,所以它们引用的都是同一个变量 i 。 当createFunctions()函数返回后,变量 i 的值是 10,此时每个函数都引用着保存变量 i 的同一个变量对象,所以在每个函数内部 i 的值都是 10

解决方法:

获取内部函数的对象result[i]时,使用匿名函数,并在匿名函数中再使用闭包函数,使得当前环境下的num被闭包函数函数调用,存储在作用域中不会被释放.

登录后复制登录后复制

        function  createFunctions2(){            var result  = new Array();            for(var i = 0 ; i <10 ; i++){                result[i] = (function(num){                    return function(){                        return num                    }                })(i)            }            return result;        }                var res2 =  createFunctions2();        console.log(res2[0]());  // 0         console.log(res2[1]());  // 1

登录后复制登录后复制

原理:
定义了一个匿名函数,并将立即执行该匿名函数的结果赋给数组。这里的匿名函数有一个参数 num,也就是最终的函数要返回的值。在调用每个匿名函数时,我们传入了变量 i。由于函数参数是按值传递的,所以就会将变量 i 的当前值复制给参数 num。而在这个匿名函数内部,又创建并返回了一个访问 num 的闭包。这样一来,result 数组中的每个函数都有自己num 变量的一个副本,因此就可以返回各自不同的数值了。

(2).当闭包函数外部包含了一个匿名函数,this指向全局

        var name = "The Window";        var object = {            name: "My Object",            getNameFunc: function () {                   return function () {        //匿名函数执行具有全局性                    return this.name;       //this指向window                };            }        };        console.log(object.getNameFunc()())  //  The Window

登录后复制登录后复制

原理:
每个函数在被调用时都会自动取得两个特殊变量:this 和 arguments。内部函
数在搜索这两个变量时,只会搜索到其活动对象为止,所以无法获取到外部的this,此时getNameFunc()返回的是一个匿名函数,并且匿名函数具有全局性,因此this指向全局的window

解决方案:
把外部作用域中的 this 对象保存在一个闭包能够访问到的变量里,就可以让闭包访问该对象了

    var name2 =  "The  Window";    var object2 = {        name:"My Object",        getNameFunc:function(){            var that =  this; //将外部函数的this保存在外部函数的活动对象中(函数中申明的变量中)            return function (){                return that.name            }        }    }        console.log(object2.getNameFunc()())   //My Object

登录后复制登录后复制

(三)
闭包的缺点
(1).由于闭包会携带包含它的函数的作用域,因此会比其他函数占用更多的内存。过度使用闭包可能会导致内存占用过多
(2).闭包只能取得包含函数中任何变量的最后一个值,所以要注意写法

javascript闭包函数的基本使用以及会遇到的问题解决

举报

你可能感兴趣的

评论                                                    

默认排序                        时间排序

载入中…

显示更多评论

javascript闭包函数的基本使用以及会遇到的问题解决

以上就是javascript闭包函数的基本使用以及会遇到的问题解决的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2738429.html

(0)
上一篇 2025年3月8日 01:50:19
下一篇 2025年3月3日 20:36:34

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • vue组件之间相互传递数据的实现方法(代码)

    本篇文章给大家带来的内容是关于php协成实现的详解(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、子组件给父组件传递数据 父组件:{{total}} Vue.component(‘son-component’…

    编程技术 2025年3月8日
    200
  • javascript监听事件之监听页面滚动的内容解析

    本篇文章给大家带来的内容是关于javascript监听事件之监听页面滚动的内容解析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 监听事件 代码 function pageChange () { // … 页面滚动时,…

    编程技术 2025年3月8日
    200
  • javascript实现多个任务一次下载的方法介绍

    本篇文章给大家带来的内容是关于php协成实现的详解(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 真实经历 最近开发项目需要做文件下载,想想挺简单的,之前也做过,后台提供下载接口,前端使用window.locat…

    编程技术 2025年3月8日
    200
  • React路由懒加载实现的另种方案(代码)

    本篇文章给大家带来的内容是关于react路由懒加载实现的另种方案(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 这篇文字简单的介绍了React在路由懒加载方面的几种实现方案。 传统的两种方式 import() 符合…

    编程技术 2025年3月8日
    200
  • JS的组合继承是什么?js组合继承的介绍

    本篇文章给大家带来的内容是关于js的组合继承是什么?js组合继承的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 组合继承(Combination Inheritance) 组合继承(Combination Inher…

    编程技术 2025年3月8日
    200
  • javascript借用构造函数的解析(附示例)

    本篇文章给大家带来的内容是关于javascript借用构造函数的解析(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 借用构造函数 为了解决原型中包含引用类型值所带来问题,开发人员开始使用一种叫做借用构造函数(co…

    编程技术 2025年3月8日
    200
  • js运算符有哪些?js运算符的详细介绍

    本篇文章给大家带来的内容是关于js运算符有哪些?js运算符的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 javascript 基础运算符分为:算术运算符、赋值运算符、关系运算符、逻辑运算符;接下来详细讲解着几种…

    编程技术 2025年3月8日
    200
  • React渲染列表的方法介绍(附代码)

    本篇文章给大家带来的内容是关于react渲染列表的方法介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 对于一个展示页面来讲, 通常有好几种展示状态(以列表页为例): 数据为空, 空页面取数据时发生错误, 错误…

    编程技术 2025年3月8日
    200
  • javascript递归函数的详解(附示例)

    本篇文章给大家带来的内容是关于javascript递归函数的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 递归函数看过很多次,但是感觉一直都没有完全的理解,这次有空看了下>,又静下心来重新看了一遍递归…

    编程技术 2025年3月8日
    200
  • Node Stream的运行机制讲解(附示例)

    本篇文章给大家带来的内容是关于node stream的运行机制讲解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 如果你正在学习Node,那么流一定是一个你需要掌握的概念。如果你想成为一个Node高手,那么流一定…

    2025年3月8日 编程技术
    200

发表回复

登录后才能评论