闭包方法的学习

Swift ——闭包 之前在代码的书写过程中,我们已经或多或少的接触过函数,函数本身也有自己的类型,它由形式参数类型,返回类型组成。如果将函数传递给a变量,那么就可以借助a来调用方法,这里addTwoInts代表函数类型。如果出现了同名函数,但是返回值或者参数不一样,那么就需要指明函数类型。否则就会报 ambiguous user of *** 错误,因为这个时候编译器不知道要给a赋值哪一个参数。把函数赋值给a,那么a里面储存的是什么呢? 运行后打印a,这里看懂存储的是函数类型.这里函数类型也是引用类型,当把函数赋值给a的时候, 阅读详情
相关链接

swift中使用@noescape的正确姿势

文档闭包

闭包可以捕获和存储其在上下文中任意常量和变量的引用。被称为包裹常量和变量。Swift会为你管理在捕获过程中涉及到的所有内存操作。

在函数章节中介绍的全局和嵌套函数也是特殊的闭包,闭包采取如下三种形式之一:

  • 全局函数式一个有名字但不会捕获任何值的闭包
  • 嵌套函数是一个有名字并可以捕获其封闭函数域内值得闭包
  • 闭包表达式是一个利用轻量级语法所写的可以捕获其上下文中变量和常量值的匿名闭包

Swift的闭包表达式有用简洁的风格,并鼓励在常见场景中进行语法优化,主要优化如下:

  • 利用上下文推断参数和返回值类型
  • 隐式返回单表达式闭包,即单表达式闭包可以省略return关键字
  • 参数名称缩写
  • 尾随闭包语法
闭包表达式
sorted方法
func backward(_ s1: String, _ s2: String) -> Bool {
    return s1 > s2
}

let names = ["C","A","E","D","B"]
//        let reversedNames = names.sorted(by: {$0 > $1})
   // 两者相同
let reversedNames = names.sorted(by: backward)
print("\(reversedNames)")
闭包表达式语法
let reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
   return s1 > s2
})

// 也可以写一行
let reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 })
根据上下文推断类型

因为所有的类型都可以被正确推断,返回箭头(->)和围绕在参数周围的括号也可以被省略

let reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 })
单表达式闭包隐式返回

单行表达式闭包可以通过省略return关键字来隐式返回单行表达式的结果

let reversedNames = names.sorted(by: { s1, s2 in s1 > s2 })
参数名称所写

Swift自动为内联闭包提供了参数名称所写功能,你可以直接通过$0,$1,$2来顺序调用闭包的参数,依次类推,如果你在闭包表达式中使用参数名称所写,你可以在闭包定义中省略参数列表,并且对应参数名称缩写的类型会通过函数类型进行推断。in关键字也同样可以被省略,因此此时闭包表达式完全由闭包函数体构成:

let reversedNames = names.sorted(by: { $0 > $1 })
运算符方法
let reversedNames = names.sorted(by: >)
尾随闭包法

如果你需要一个很长的闭包表达式作为最后一个参数传递给函数,可以使用尾随闭包来增强函数的可读性。尾随闭包是一个书写在函数括号之后的闭包表达式,函数支持将其作为最后一个参数调用。在使用尾随闭包时,你不用写出它的参数标签。

         func someFunctionThatTakesAClosure(closure: (_ str: String) -> String) {
            // 函数体部分
            print("可以判断是谁调取的:\(closure("给你一"))")
         }

         // 以下是不使用尾随闭包进行函数调用
        someFunctionThatTakesAClosure(closure: { str in
            // 闭包主体部分
            print("返回二 \(str)")
            return "返回二"

        })

        // 以下是使用尾随闭包进行函数调用
        someFunctionThatTakesAClosure() { str in

            // 闭包主体部分
            print(str)
            return "返回三"
        }

        // sorted(by:) 也可以使用这样写
        let reversedNames = names.sorted() { $0 > $1 }

如果闭包表达式是函数或方法的唯一参数,则当你使用尾随闭包的使用,甚至可以把()去掉

let reversedNames = names.sorted { $0 > $1 }

当闭包非常的长以至于不能在一行中进行书写时,尾随闭包变的非常有用。举例来说,Swift的 Array类型有一个 map(_:)方法,这个方法获取一个闭包表达式作为其唯一参数。该闭包函数会为数组中的每一个元素调用一次,并返回该元素所映射的值。具体的映射方式和返回值类型由闭包来指定。

当提供给数组的闭包应用于每个数组元素后,map(_:) 方法将返回一个新的数组,数组中包含了与原数组中的元素一一对应的映射后的值

        let strings = numbers.map { (number) -> String in
            var number = number
            var output = ""

            repeat {
                output = digitNames[number % 10]! + output
                number /= 10
            } while number > 0

            return output
        }
        print(strings)

map(_:) 为数组中每一个元素调用了一次闭包表达式。你不需要指定闭包的输入参数的 number 的类型,因为可以通过要映射的数据类型进行推断

值捕获

注意:

如果你将闭包赋值给一个类实例的属性,并且该闭包通过访问该实例或其成员而捕获了该实例,你将在闭包和该实例间创建一个循环强引用。Swift使用捕获列表来打破这种循环强引用。


   func makeIncrement(forIncrement amount: Int) -> () -> Int {
        var runningTotal = 0

        func incrementer() -> Int {

            runningTotal += amount
            return runningTotal
        }
        return incrementer
    }

如果我们单独考虑嵌套函数 incrementer() 我们会发现它有些不同寻常:

func incrementer() -> Int {
   runningTotal += amount
   return runningTotal
}

incrementer() 函数并没有任何参数,但是在函数体内访问了runningTotal 和 amount 变量。这是因为它从外围函数捕获了 runningTotal 和 amount 变量的引用。捕获引用保证了 runningTotal 和 amount 变量在调用完 makeIncrementer 后不会消失,并且保证在下次执行 incrementer 函数式, runningTotal 依旧存在。

调用此函数方法

   func makeIncrement(forIncrement amount: Int) -> () -> Int {
        var runningTotal = 0

        func incrementer() -> Int {

            runningTotal += amount
            return runningTotal
        }
        print("runningTotal ****** \(runningTotal)")
        return incrementer
    }

    let incrementByTen = makeIncrement(forIncrement: 10)

    print(incrementByTen())
    print(incrementByTen())
    print(incrementByTen())
    print(incrementByTen())

    /*
    10
    20
    30
    40
    */

该例子定义了一个叫做 incrementByTen 的常量,该常量指向一个每次调用会将 runningTotal 变量增加 10 的 incrementer 函数。如果从新创建一个 incrementer, 它会有属于自己的引用,指向一个全新、独立的 `runningTotal变量:

闭包是引用类型

上面的例子中,incrementBySeven 和 incrementByTen 都是常量,但是这些常量指向的闭包仍然可以增加其不活动额变量的值。这是因为函数和闭包都是引用类型。
无论你将函数或闭包赋值给一个常量还是变量,你实际上都是讲常量或变量的值设置为对应函数或闭包的引用。上面的例子中,指向闭包的引用 incrementByTen 而并非闭包内容本省。
这也意味着如果你讲闭包赋值给了两个不同的常量或变量,两个值都会指向同一个闭包:

let alsoIncrementByTen = incrementByTen
alsoIncrementByTen()
// 返回的值为50
逃逸闭包

当一个闭包作为参数传到一个函数中,但是这个闭包在函数返回之后才被执行,我们称该闭包从函数中逃逸。当你定义接受闭包作为参数的函数时,你可以在参数名之前标注 @escaping,用来指明这个闭包是允许“逃逸”出这个函数的。
一种能使闭包“逃逸”出函数的方法是,将这个闭包保存在一个函数外部定义的变量中。举个例子,很多启动异步操作的函数接受一个闭包参数作为completion handler。这类函数会在异步操作开始之后立刻返回,但是闭包直到异步操作开始之后立刻返回,但是闭包直到异步操作结束后才会被调用。在这种情况下,闭包需要“逃逸”出函数,因为闭包需要在函数返回之后被调用。

   var completionHandlers: [() -> Void] = []
   func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
      completionHandlers.append(completionHandler)
   }

someFunctionWithEscapingClosure(_:) 函数接受一个闭包作为参数,该闭包被添加到一个函数外定义的数组中。如果你不将这个参数标记为 @escaping,就会得到一个编译错误。
将一个闭包标记为 @escaping 意味着你必须在闭包中显式地引用 self。

var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
    completionHandlers.append(completionHandler)
}

func someFunctionWithNonescapingClosure(closure: () -> Void) {
    closure()
}


class someClass {
    var x = 10
    func doSomthing() {
        someFunctionWithEscapingClosure {
            self.x = 100
            print("调取了1")
        }

        someFunctionWithNonescapingClosure {
            x = 200
            print("调取了2")
        }
    }
}

let instance = someClass()

instance.doSomthing()
print(instance.x)

// 将函数中的闭包方法在函数外调取,相当于block异地调
completionHandlers.first?()
print(instance.x)

// 结果
调取了2
200
调取了1
100
自动闭包

自动闭包是一种自动创建的闭包,用于包装传递给函数作为参数的表达式。这种闭包不接受任何参数,当它被调用的时候,会返回被包装在其中的表达式的值。这种遍历语法让你能够省略闭包的花括号,用一个普通的表达式来代替显示的闭包。
自动闭包让你能够延迟求值,因为知道你调用这个闭包,代码段才会被执行。延迟求值对于那些有副作用(Side Effect)和高计算成本的代码来说是很有益处的,因为它能控制代码的执行时机。

var customersInLine = ["C","A","E","B","D","F"]
print(customersInLine.count)

// 此处只是一个简单的函数赋值,并不会执行移除
let customerProvider = { customersInLine.remove(at: 0) }
print(customersInLine.count)

print("现在,移除第一个元素 \(customerProvider())")

print(customersInLine.count)

尽管在闭包的代码中,customersInLin的第一个元素被移除了,不过在闭包在调用之前,这个元素是不会被移除的。如果这个闭包永远不被调用,那么在闭包里面的表达式将永远不会执行,这意味着列表中的元素永远不会被执行。

将闭包作为参数传递给函数时,你能获得同样的延时求值行为。


// 自定义的一个自己需要的符合要求的函数式
func test() -> String {
    return "我很好"
}

// 在此处固定闭包函数类型
func serve(customer customerProvider: () -> String) {
    print("此处调取方法 \(customerProvider())")
}

// autoclosure的使用对比
func serveOne(customer customerProvider: @autoclosure () -> String ) {
    print("调取闭包方法:\(customerProvider())")
}

var customersInLine = ["C","A","E","B","D","F"]
print(customersInLine.count)

// 此处只是一个简单的函数赋值,并不会执行移除
let customerProvider = { customersInLine.remove(at: 0) }
print(customersInLine.count)

print("现在,移除第一个元素 \(customerProvider())")
print(customersInLine.count)

// 直接在自身处理闭包
serve { () -> String in
    // 这种是自定义
    return "你好啊"
}

// 在外部调取闭包
serve(customer: test)

// 这种是将固定类型的放进去
serve(customer: { customersInLine.remove(at: 0) })
// 加了autoclosure,相当于去掉了外部括号,不太好看出是自动闭包
serveOne(customer: customersInLine.remove(at: 0))

/**结果**/
6
6
现在,移除第一个元素 C
5
此处调取方法 你好啊
此处调取方法 我很好
此处调取方法 A
调取闭包方法:E

通过将参数标记为 @autoclosure 来接收一个自动闭包。现在你可以将该函数当做接受 String 类型参数(而非闭包)的函数来调用。customerProvider 参数将自动转化为一个闭包,因为该参数被标记了 @autoclosure 特性。

// autoclosure
func serveOne(customer customerProvider: @autoclosure () -> String ) {
    print("调取闭包方法:\(customerProvider())")
}

serveOne(customer: customersInLine.remove(at: 0))

注意:

过度使用 autoclosures 会让你的代码变得难以理解。上下文和函数名应该能够清晰地表明求值是被延迟执行的。

如果你想让一个自动闭包可以“逃逸”,则应该同时使用 @autoclosure 和 @escaping 属性。

var customerProviders: [() -> String] = []

func collectCustomerProviders(_ customerProveder: @autoclosure @escaping () -> String) {
    customerProviders.append(customerProveder)
}

var customersInLine = ["C","A","E","B","D","F"]

collectCustomerProviders(customersInLine.remove(at: 0))
collectCustomerProviders(customersInLine.remove(at: 0))

for customerProvider in customerProviders {

    print("自动闭包:\(customerProvider())")
}
Python学习笔记--过解决一个需求问题来了解闭包 闭包的过程其实好比类(父函数)生成实例(闭包),不同的是父函数只在调用时执行,执行完毕后其环境就会释放,而类则在文件执行时创建,一般程序执行完毕后作用域才释放,因此对一些需要重用的功能且不足以定义为类的行为,使用闭包会比使用类占用更少的资源,且更轻巧灵活。那是因为,在 Python 中,如果一个函数使用了和全局变量相同的名字且改变了该变量的值,那么该变量就会变成局部变量,那么就会造成在函数中我们没有进行定义就引用了,所以会报该错误。属性,如果函数是闭包的话,那么它返回的是一个由 cell 组成的元组对象。 阅读详情

相关推荐

绕过限制?实测修改UA在PC端运行微信小程序的可行性及风险

本文探讨了通过修改User-Agent(UA)在PC端运行微信小程序的技术可行性及风险。分析了小程序设备限制的技术原理,包括`wx.getSystemInfo`API和UA检测机制,并提供了多种修改方案及其局限性。同时强调了潜在的安全和法律风险,推荐使用官方模拟器或安卓模拟器等更安全的替代方案。

weixin_30879169的博客 362

简单聊聊Swift闭包的用法

1.闭包 闭包是一个捕获了外部变量或者常量的函数,可以有名字的函数,可以是匿名的函数,也可以是不捕获外部变量的函数。所以可以说闭包是特殊的函数。 闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 ObjC 中的代码块(blocks)比较相似。 捕获的变量,可以写在捕获列表里. 如果使用捕获列表,即使省略了参数名字、参数类型、返回类型,也必须要用 in 的关键字 ●捕获列表里面的是捕获的是值,不可变, ●未在捕获列表里,捕获到的是地址,可以修改

砥砺前行的博客 1535

医学图像分割实战:基于TransUNet训练自己的眼底硬渗出物数据集(附完整代码)

本文详细介绍了基于TransUNet的眼底硬渗出物分割实战指南,涵盖数据预处理、模型调优、训练策略及性能优化等关键环节。通过代码复现和实验对比,展示了TransUNet在医学图像分割中的优势,为糖尿病视网膜病变的早期诊断提供技术支持。

weixin_42524708的博客 361

IOS11,Swift4从入门到精通-09闭包

本节内容转载于 http://www.swift51.com/swift4.0/chapter2/07_Closures.html 本页包含内容: 闭包表达式 尾随闭包 值捕获 闭包是引用类型 逃逸闭包 自动闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数比较相似。 闭包可以...

liu_jiuyang的博客 406

四、嘉立创EDA原理图绘制实战:从零搭建STM32温湿度监测系统

本文详细介绍了使用嘉立创EDA标准版从零开始绘制STM32温湿度监测系统原理图的完整流程。涵盖核心元器件选型、电源电路设计、ADC按键创新应用及模块化布局技巧,帮助电子爱好者快速掌握STM32系统设计,提升嵌入式开发实战能力。

h0i1j2k3l的博客 883

HDRP shader 获取阴影(Custom Pass)

Unity:2021.3.0f1 HDRP:12.1.6

LanQ的博客 2097

【Swift】闭包(Closure)

从上面的函数和闭包的定义中可以看到是相同的,都是传入参数,可对参数进行操作,然后返回一个值。从定义中可以看出,函数是有name的,而闭包没有。那么闭包是如何调用的呢?函数中给这个求面积的函数命名为area,而闭包是用{}包裹起来,在这里闭包是没有名字的,所以将闭包赋值相当于给闭包一个名字,这样闭包就能像函数一样使用。所以area约等于。闭包是特殊的函数,当函数作为参数,或返回值,或匿名函数时,称为闭包。从area函数看到,函数中只传入一个闭包,然后返回一个Double值。

Yzzzzw01的博客 1159

Potplayer + LAVFilters + madVR 配置教程

文章目录Potplayer + LAVFilters + madVR 配置教程工具安装篇设置调教1.potplayer播放器设置加载LAVFilters和madVR1.选择“源滤镜/分离器”选项,选择“滤镜/解码器管理”2.“添加外部滤镜”3.浏览到刚才LAVFilters解压的文件夹,分别添加图示项。4.添加后回到管理界面设置,点击左边的”LAV AudioDecoder”,将右边”音频解码器”...

re 16万+

Swift:闭包(Closures)

本人录制技术视频地址:https://edu.youkuaiyun.com/lecturer/1899 欢迎观看。一、 基本概念 闭包(Closures)是自包含的功能代码块,可以在代码中使用或者用来作为参数传值。 在Swift中的闭包与C、OC中的blocks和其它编程语言(如C#)中的lambda, javascript中的函数嵌套等类似。 闭包可以捕获和存储上下文中定义的的任何常量和变量的引用。这就是所...

秋恨雪 3094

system_server_lowmem真的是内存不足吗?

Android系统中的system_server_lowmem真的表示系统的内存遇到瓶颈了吗?以及遇到这类日志该如何分析系统的内存,本文会回答这个问题。

jidapenglin28的专栏 513

使用AI预测彩票的架构思路

彩票是随机的数字游戏,不要过度依赖AI,本文仅供娱乐研究

淘淘小窝 9407

java 闭包方法_用Java语言编写闭包学习简单方法

java 闭包方法 什么是封包? 闭包是一个内部函数,可以访问外部(封装)函数的变量-作用域链。 闭包具有三个作用域链:它可以访问自己的范围(在大括号之间定义的变量),可以访问外部函数的变量,并且可以访问全局变量 简单来说,就是函数内部的一个函数,它依赖于外部函数中的变量来工作。 理解概念的最好方法就是做到这一点。 因此,让我们在闭包上有一些例子。 function do...

编程故事的地方 908

YOLO26全网首发:CVPR2026 MixerCSeg | DEGConv方向引导边缘门控,破解细长裂缝检测难题

DEGConv通过方向先验嵌入、边缘增强卷积和动态门控三大机制,针对性解决了YOLO在处理裂缝类细长、多方向、低对比度目标时的特征提取不足问题,显著提升了裂缝检测的精度与鲁棒性。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1033

Swift 学习笔记 (解决Swift闭包中循环引用的三种方法)

Swift 学习笔记 (解决Swift闭包中循环引用的三种方法)

xuan2717的博客 279

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【Dart学习】-- Dart之匿名方法&闭包

一,匿名方法定义 (参数1,参数2,....){ 方法体... return 返回值 } 二,匿名方法特性 可赋值给变量,通过变量进行调用 可在其他方法中直接调用或传递给其他方法 void main(List<String> args) {//无参匿名函数 var func = () {   print("Hello...

weixin_33835103的博客 399

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

golang 学习(十九)递归方法和闭包

递归方法和闭包 递归方法 计算1~100的和 func fn2(n int) int { if n > 1 { return n + fn2(n-1) } else { return 1 } } sum := fn2(100) fmt.Println(sum) 计算5的阶乘 func fn3(n int) int { if n > 1 { return n * fn2(n-1) } else { return 1 } } factorial := fn2(5) fm

wangyufeng43400141的专栏 280

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

用Java语言编写闭包学习简单方法

什么是封包? 闭包是内部函数,可以访问外部(封装)函数的变量-作用域链。 闭包具有三个作用域链:它可以访问自己的范围(在大括号之间定义的变量),可以访问外部函数的变量,并且可以访问全局变量 简单来说,就是函数内部的一个函数,它依赖于外部函数中的变量来工作。 理解概念的最佳方法是做到这一点。 因此,让我们在闭包上有一些例子。 function doSomeMath(){var a=5;va...

编程故事的地方 243

Python中闭包的概念定义及应用、装饰器、类方法静态方法和委托属性的学习

目录一.什么是闭包?闭包的特征?定义闭包,完成的功能为:传入一个数求和并输出二.定义一个装饰器:打印函数运行花费的时间三.定义一个类:闭包的特征?定义闭包,完成的功能为:传入一个数求和并输出例如:传入10 ->输出10传入15 ->输出25传入20 ->输出45 结果如图:(你在执行之前获取一个时间,执行函数,在执行函数之后获取一个时间,去求时间差,time模块) 要求:包含一个对象属性,且用_(单下划线)命名的定义一个类方法(装饰器)定义一个静态方法(装饰器)定义委托属性(三个类装饰器): 可以

weixin_46966890的博客 458

Swift学习记录 -- 14.闭包的使用和解决循环引用方法

Swift中的闭包 , 几乎和OC中的block一模一样 , 我个人又比较偏好block , 所以觉得闭包还是蛮不错的 . 在循环引用问题上 , 解决方案也更加简洁// HttpTool类 import UIKitclass HttpTool: NSObject { //闭包写法 : (参数列表) -> (返回值类型) func loadData(callBack:(jsonData:

coderMy的博客 567

【学习笔记】用python的非闭包、闭包(函数式编程)、面向对象方法解决旅行者问题

三种方法实地累计旅行者所走路径长度,origin=0 为起点,编写一个函数,不断调用这个函数可以得到与初始位置的距离result,每次调用函数传入的参数为该次旅行所走距离step。例如,一开始x = 0,走了距离3,step = 3,result = 3,再走距离5,step= 5,result = 8。难点在于每调用完一次函数就要存储一次结果,与下次走的距离进行累加 方法一:非闭包 假设第一

NLP学习记录 415

数组forEach方法对闭包的思考

经典闭包: let arr = ['a','b','c']; for(var i = 0; i < arr.length; i ++){ setTimeout(() => { console.log(i); //闭包!i == 3 }, 2000); } forEach没有形成闭包: let arr = ['a','b','c']; // 没有形成闭包 arr.forEach((item, index) => { setTimeout(()

zyz00000000的博客 1683

闭包全面理解

闭包全面理解 一、JS作用域 1.1 作用域理解(范围) 1.1.1 全局作用域 全局作用域在页面打开时被创建,页面关闭时被销毁 编写在script标签中的变量和函数,作用域为全局,在页面的任意位置都可以访问到 在全局作用域中有全局对象window,代表一个浏览器窗口,由浏览器创建,可以直接调用 全局作用域中声明的变量和函数会作为window对象的属性和方法保存 1.1.2 函数作用域 调用函数时,函数作用域被创建,函数执行完毕,函数作用域被销毁 每调用一次函数就会创建一个新的函数作用

weixin_45828332的博客 221

Rust闭包

闭包

qq_74143285的博客 925

js中的闭包以及闭包的实际运用,前端开发学习内容

i < 5;i++) {return ireturn resconsole.log(create()) // 结果: [4,4,4,4,4]分析:由于每个函数的作用域中都保存着同一个 函数的活动对象(create 函数), 所以他们引用的都是同一个变量 i.如何解决这个问题?我们可以使用匿名函数来创建一个闭包, 让闭包的行为来符合预期i < 5;i++) {})(i)return resconsole.log(create()) // 结果: [0,1,2,3,4]

2401_84092666的博客 664

学习Javascript闭包(Closure)

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 下面就是我的学习笔记,对于Javascript初学者应该是很有用的。 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。   var n=999;   function f1(){     alert(n);   }   f1(); /

feelinghappy的专栏 120
上一篇: swift中的??
下一篇: Swift版本语法的变化
瓦怕落地
博客等级 码龄11年 16粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值