闭包

前端面试题整理

萝らか妹 提交于 2020-03-27 12:44:43
JS部分 Q:什么是闭包? A:闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见方式,就是在一个函数内部创建另一个函数 (闭包就是能够读取其他函数内部变量的函数。) Q:闭包的用途 A:可以读取函数内部的变量;让这些变量的值始终保持在内存中 Q:谈谈你对this的理解 A:this是js的一个关键字,随着函数使用场合不同,this的值会发生变化,但是又一个总原则,那就是this指的是调用函数的那个对象 Q:说说你对模块化的看法 A:模块化的优点 1.适合团队开发项目,比较好管理 2.利于代码复用 3.符合程序设计的理念 4.避免命名冲突 Q:事件委托是什么? A:利用冒泡的原理,把事件加到父级上,触发执行效果 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> <ul id="ul"> <li>aaaaaaaa</li> <li>bbbbbbbb</li> <li>cccccccc</li> </ul> <script> window.onload = function(){ var oUl = document.getElementById("ul"); var aLi = oUl.getElementsByTagName("li"); /*

javascript”面向对象编程” – 4 function也是”类”

≯℡__Kan透↙ 提交于 2020-03-27 11:38:41
function在javascript中用来创建函数或方法,但要想实现面向对象方式的编程,类是不可或缺的角色之一,而且是主角。但javascript中并没有类概念,所谓的类也是模拟而来,通过函数加闭包模拟出类成员及私有成员(关于闭包可以参见 跨越边界: 闭包 )。这里我们将用比较平实的方式来了解一下javascript中的”类”,避开一些生硬的原理。 既然是用function来模拟类,所以编写代码创建类的关键字还是function。我们创建一个座标点类。 function Point() { this.X = 0; this.Y = 0; }; var zeroPoint = new Point(); alert("当前座标值( X:" + zeroPoint.X + " , Y:" + zeroPoint.Y + " )"); */ /*--> */ 大家都知道非静态类成员的访问需要通过对象来完成,所以先new出了一个Point类型对象,再通过该对象完成X和Y轴座标值的访问。从语法上来说,javascript类对象的创建过程和C#等差不多,但实现机制却不相同。这里的new创建出了一个Object,后续的Point()函数执行时将其this指向了这个新的Object对象。Point中的this.X和this.Y是Point类的两个公共成员,所以Point的对象可以直接对它们进行访问

python基础知识(day11)

↘锁芯ラ 提交于 2020-03-26 02:19:00
day11 今日内容 函数中高级(闭包/高阶函数) 内置函数 内置模块(.py文件) 内容回顾 函数的基础概念 函数基本结构 参数 定义函数时 def func(a1,a2):pass def func(a1,a2=None):pass def func(*args,**kwargs):pass 调用函数 位置参数在前,关键字参数在后 函数小高级 函数可以做变量 函数可以做参数 Python中以函数为作用域 lambda表达式(匿名函数) 内置函数 内容详细 函数中高级 1.1 函数可以做返回值 函数是由谁创建的,作用域就从他那开始 # 函数当返回值 def func(): print(123) def bar(): return func v = bar() v() print(v) # 123 <function func at 0x00000273959B1EA0> name = 'llk' def bar(): name = 'hkq' def inner(): print(name) return inner v = bar() v() print(v) # hkq <function bar.<locals>.inner at 0x0000026B459CD488> name = 'llk' def bar(name): def inner(): print(name)

Swift:闭包(Closures)

橙三吉。 提交于 2020-03-25 08:42:43
一、 基本概念 闭包(Closures)是自包括的功能代码块,能够在代码中使用或者用来作为參数传值。 在Swift中的闭包与C、OC中的blocks和其他编程语言(如C#)中的lambda, javascript中的函数嵌套等类似。 闭包能够捕获和存储上下文中定义的的不论什么常量和变量的引用。 这就是所谓的变量和变量的自封闭, 因此闭包还会处理全部捕获的引用的内存管理。 全局函数和嵌套函数事实上就是特殊的闭包。 闭包的形式有: (1)全局函数都是闭包。有名字但不能捕获不论什么值。 (2)嵌套函数都是闭包。且有名字,也能捕获封闭函数内的值。 (3)闭包表达式都是无名闭包,使用轻量级语法。能够依据上下文环境捕获值。 Swift中的闭包有非常多优化的地方: (1)依据上下文判断參数和返回值类型 (2)从单行表达式闭包中隐式返回(也就是闭包体仅仅有一行代码,能够省略return) (3)能够使用简化參数名,如$0, $1(从0開始,表示第i个參数...) (4)提供了跟随闭包语法(Trailing closure syntax) 二、使用举例(这里所列举的样例,均从《The Swift Programming Language》这本书总结所得) 以下用Swift标准库中的sort方法来一步步简化闭包写法 sort函数须要两个參数 參数一:数组 參数二:一个闭包:带有两个參数

协程 和 async await

拥有回忆 提交于 2020-03-23 15:50:59
协程, 是 为了 避免 闭包传递变量 的 性能损耗 而产生 。 如果不是 为了 避免 闭包传递变量 的 性能损耗 , 线程池 和 Task 已经够了, 不需要 再设计 出 协程 来 。 闭包, 会 让 所有共享 的 变量 变成 引用 访问 的 方式,包括 值变量 。 因为 闭包 是将 变量 放到 堆 里 共享 。 协程 就是在 堆 里 模拟出一个 堆栈 和 协程“上下文” 存储区, 这和 操作系统 的 线程 堆栈 和 上下文 架构 是 相似 的 。 上下文存储区 保存 每个 协程 的 堆栈 的 栈顶 栈底, 在 切换 协程 时, 将 栈顶 栈底 存入 CPU 寄存器, 这样, 代码 中 对 变量 的 访问 就可以 和 线程 一样, 通过 编译在 指令中 的 偏移量 操作数 加上 栈底 的 地址 就可以得到 变量 的 地址 。 这样 对 函数 局部变量 的 访问 就和 线程 一样 , 指令 偏移量 操作数 + 栈底 , 这样 一次 寻址 。 避免了 闭包 将 变量 变成 引用访问 的 二次寻址 带来 的 性能损耗 。 所以, C# 的 async await 本身 就 包含了 一个 协程 的 实现, 这大概也是 C# async await 要通过 编译器 把 代码 编译为 状态机 而不是 Task.ContinueWith() 的 原因 。 协程 需要 编译器 在 汇编 层面 实现

创建和使用闭包

巧了我就是萌 提交于 2020-03-23 13:18:35
函数内部定义的函数称为闭包(closure)。闭包的特点是在其函数体中,可以使用局部 参数,也可以使用其父环境中的变量。 举个例子,假设我们有如下函数: add <- function(x, y) { x + y } 此函数有两个参数。每次调用 add( ) 函数时,都需要提供这两个参数。如果使用闭 包,就可以生成带有事先指定参数的特殊版本。在下一节中,我们将创建一个简单的闭包。 1.创建一个简单的闭包 现在我们创建一个名为 addn( ),包含一个参数 y 的函数。此函数不执行加法运算, 而是在其内部创建一个子函数,并将 y 加到其参数 x 上: addn <- function(y) { function(x) { x + y } } 这里大家可能需要多想几遍才能理解,addn( ) 函数并不会像一般函数那样返回一个 数值,而是返回一个闭包,即定义在一个函数内部的函数。此闭包计算 x+y 的值,其中 x 是 局部参数,y 是其封闭环境中的参数。换句话说,addn( ) 并不是一个“计算器”,而是 一个产生“计算器”的“计算器工厂”。 函数工厂使我们能够创建专用的计算函数。例如,可以创建两个函数,给一个数值向 量分别加上 1 和 2: add1 <- addn(1) add2 <- addn(2) 这两个函数的作用就相当于 add(x, y) 的第 2 个参数 y 分别固定为 1

Python自学笔记(13day)

人走茶凉 提交于 2020-03-23 12:05:39
(1)函数的嵌套   (1)首先明白三点:调用函数意思就是:调用函数所得到的结果是什么。 函数没有被调用,则函数里面代码永远不会被执行。 调用函数只有拿到返回值才有结果 def func(): def su(): print("shuai") func() #输出:啥都没有因为su()没有被调用 def func(): def su(): print("shuai") su() func() #输出:shaui none 因位执行到su()打印出shuai就结束了,函数func()没有拿到返回值。 def func(): def su(): print("shuai") return shuai su() func() #输出:shuai shuai 因位执行到su()打印出shuai就结束了,函数func()也拿到返回值。 (2)函数的多层嵌套 def inner (): a=1 def inner1(): b=2 print(a) print("inner") def inner2(): print(a) inner2() inner() 总结:(1)全局变量不能用局部变量,局部变量看可以用全局变量,但是不可对全局变量中的不可变数据类型进行修改(即对其加减乘除),如果想要修改用gloabl(),它声明的是去全局变量。     (2)同理,内部函数可以用外函数中的变量

python 15 闭包函数

China☆狼群 提交于 2020-03-23 09:09:04
目录 1.函数对象 2.函数嵌套 3.闭包函数 4.闭包的用途 1.函数对象 精髓:把函数当成变量去用,具体可以分为四个方面的使用 1、可以赋值,函数名A赋值给B,直接B()就可以引用该函数了 f=func print(f,func) f() 2、函数可以作为参数传入另外一个函数 def foo(x): # x = func的内存地址 # print(x) x() foo(func) # foo(func的内存地址) 3、函数的返回值可以是一个函数 def foo(x): # x=func的内存地址 return x # return func的内存地址 res=foo(func) # foo(func的内存地址) print(res) # res=func的内存地址 res() 4、可以当做容器类型的一个元素 l=[func,] # print(l) l[0]() dic={'k1':func} print(dic) dic['k1']() 函数对象应用示范: def login(): print('登录功能') def transfer(): print('转账功能') def check_banlance(): print('查询余额') def withdraw(): print('提现') def register(): print('注册') func_dic = {

【JavaScript】JS总结 – 乱

会有一股神秘感。 提交于 2020-03-22 22:50:31
一、 重要:js中的function函数声明、函数表达式 // 函数声明 // Ex: 会在代码执行之前提前加载到作用域中,即js解析器会优先读取,确保在所有代码执行之前声明已经被解析;所以可以在定义之前调用。 function test(){ document.write("test() invoke!" + "<br>"); } // 函数表达式 // Ex: 在代码执行到那一行的时候才会有定义;定义之后才能调用。 var t2 = function(){ document.write("t2() invoke!" + "<br>"); } //函数声明:会在代码执行之前提前加载到作用域中 test("1"+name); // test() invoke!14 var name =1; function test(name){ document.write("test() invoke!" + name + "<br>"); } name=2; test("2"+name); //test() invoke!22 //函数表达式:在代码执行到那一行的时候才会有定义 var t2; //t2(); // t2 is not a function test("21"+name); //test() invoke!212 name =3; test("22"+name); /

22、Python之函数对象和闭包

拜拜、爱过 提交于 2020-03-21 07:53:04
目录 一、函数对象 1.1 可以被赋值 1.2 函数可以当作参数传给另一个函数 1.3 函数可以当作一个函数的返回值 1.4 函数可以当作容器类型的一个元素 二、函数嵌套 2.1 函数的嵌套调用:在调用一个函数的过程中又调用其他函数 2.2 函数的嵌套定义:在函数内定义其他函数 三、闭包函数 3.1 什么是闭包函数 3.2 闭包函数的应用 一、函数对象 可以把函数作为变量去使用,不加括号作为内存地址,加括号作为函数运行作为返回值 1.1 可以被赋值 # func=内存地址 def func(): print('from func') f=func print(f,func) # '<function func at 0x0000027B07F36280> <function func at 0x0000027B07F36280>' f() # from func 1.2 函数可以当作参数传给另一个函数 # func=内存地址 def func(): print('from func') def foo(x): # 若x = func的内存地址 print(x) # x() foo(func) # 则返回为foo(func的内存地址) <function func at 0x0000027B07F36280> def foo(x): # x = func的内存地址 # print(x