摘要:闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。而此时我们尝试在返回之前更改得到证明。我们一般让其返回一个函数,是希望这个闭包能按照我们的预期进行。
闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。
常见闭包出现的问题
function createFunction(){ var result = new Array(); for(var i=0; i<10; i++){ result[i] = function(){ return i; } } console.log("i 的值:"+ i) return result; }
createFunction() 返回的结果
当我们调用 createFunction()[1]();时返回的是
事实上arr的每一项调用的结果都是10
为什么呢?
事实上你在调用每一项时,其实是这样的
function childFunction(){ var i = 10; return function(){ return i; } }
这个 i 来自它的父级作用域
或者我们这么说,return i; 中的 i 跟 for循环中的 i 其实是不一样的。因为此时的
函数并没有调用,而当你调用的时候,它才去作用域链搜索 i 的值。而此时 i = 10;
我们尝试在返回之前更改 i =9999;
得到证明。
那么要怎样才能让它返回我们预期的那样呢?
我们只要把 result [i] 中的 i 当做参数传进函数
result[i] = (function(num){ return function(){ return num; } })(i)
这一段代码到底发生了什么?我们让 外层 的函数传入参数并立即执行,此时里面的 num 等于传入的参数, 等到最内层函数调用的时候,它会拿到外层的num。
最后,很多人以为闭包指的是一个函数被一个函数返回,其实不是。它指的是 有权访问另一个函数作用域中的变量的函数,跟是不是被 返不返回并没有关系。我们一般让其返回一个函数,是希望这个闭包能按照我们的预期进行。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/95031.html
摘要:设计模式得存在让系统代码可重用可扩展可解耦更容易被人理解且保证代码可靠性。设计模式使代码真正工程化。设计模式是一个庞大而又复杂的体系,单例模式大概是种设计模式中相对比较简单的一种。了解完高阶函数可能加快我们理解设计模式哟 showImg(https://segmentfault.com/img/bVbgyeK?w=500&h=375); 设计模式得存在让系统代码可重用、可扩展、可解耦、...
摘要:为什么要采用面向对象编程解决问题更容易设计计算机程序就是为了解决人类的问题。面向对象编程需要对业务及代码的架构是有一定的要求的。 1. 编程方式 我们目前的编程方式大体可以有以下三种编程方式: 顺序编程 过程式编程 面向对象编程 在讲面向对象编程时先讲一下什么是顺序编程,什么是过程式编程,什么是面向对象编程: 顺序编程: 就是只用一个单线程去执行一段代码,执行过程根据代码依次从上...
摘要:打开源码,首先你会看到这样的代码结构这是一个自调用匿名函数。模式,是自执行函数的高级模式,可以非常方便的在各个匿名闭包中以全局对象调用闭包函数。 打开jQuery源码,首先你会看到这样的代码结构: (function(window,undefined ){ // })(); 这是一个自调用匿名函数。什么东东呢?在第一个括号内,创建一个匿名函数;第二个括号,立即执行 为什么要创建这样一个...
摘要:构造函数通过原型继承了构造函数和原型,这就形成了一个链条,通俗的讲就是原型链继承。而且方法只能冒充构造函数里面的属性和方法而无法冒充原型对象里面的属性和方法还有最大的问题就是重复使用。 前言: 写到这里,差不多就把OOP完结了,写了几篇OOP的文章,但是只是略懂皮毛,可能深入的OOP还有很多,但是我感觉写到这里也算是差不多完结了。 继承 继承是面向对象比较核心的概念,其他语言可能实现...
阅读 2655·2021-11-24 10:44
阅读 1895·2021-11-22 13:53
阅读 1906·2021-09-30 09:47
阅读 3704·2021-09-22 16:00
阅读 2430·2021-09-08 09:36
阅读 2312·2019-08-30 15:53
阅读 2789·2019-08-30 15:48
阅读 976·2019-08-30 15:44