当前位置: 首页 > news >正文

赤峰市网站建设淘宝交易指数换算工具

赤峰市网站建设,淘宝交易指数换算工具,wordpress 帐号共用,粉丝帮女流做的网站一、闭包是什么 #xff08;一#xff09;闭包是什么 我们先来看看javascript中的闭包。 在函数外部无法读取函数内的局部变量。但是我们有时候需要得到函数内的局部变量#xff0c;那么如何从外部读取局部变量#xff1f;那就是在函数的内部#xff0c;再定义一个函数。…一、闭包是什么 一闭包是什么 我们先来看看javascript中的闭包。 在函数外部无法读取函数内的局部变量。但是我们有时候需要得到函数内的局部变量那么如何从外部读取局部变量那就是在函数的内部再定义一个函数。 function f1(){var n999;function f2(){alert(n);} }在上面的代码中函数f2在函数f1内部这时f1内部的所有局部变量对f2都是可见的。但是反过来就不行f2内部的局部变量对f1就是不可见的。这就是链式作用域子作用域会一级一级地向上寻找所有父作用域的变量。 既然f2可以读取f1中的局部变量那么只要把f2作为返回值我们不就可以在f1外部读取它的内部变量了吗 function f1(){var n999;function f2(){alert(n);}return f2; } var resultf1();//实际上f1()执行完之后并没有释放内存n还在 result(); // 999。执行f2()能访问f1中的n上一节代码中的f2函数就是闭包。 各种专业文献上的闭包定义非常抽象很难看懂。我的理解是闭包就是能够读取其他函数内部变量的函数。 由于只有函数内部的子函数才能读取局部变量因此可以把闭包简单理解成定义在一个函数内部的函数。 所以在本质上闭包就是将函数内部和函数外部连接起来的一座桥梁。 闭包可以读取函数内部的变量可以让这些变量的值始终保持在内存中。 f1是f2的父函数而f2被赋给了一个全局变量这导致f2始终在内存中而f2的存在依赖于f1因此f1也始终在内存中不会在调用结束后被垃圾回收机制回收。 二闭包的优缺点 优点 直接访问父作用域中的局部变量避免了传参的问题 逻辑连续避免脱离当前逻辑在外部编写代码 缺点 因为使用闭包可以使函数在执行完后不被销毁保留在内存中如果大量使用闭包就会造成内存泄露内存消耗很大 三使用场景 1设置timer 2用后即弃的一次性功能没必要另外写个函数 四思考题 如果你能理解下面两段代码的运行结果应该就算理解闭包的运行机制了。 代码片段一。 var name The Window; var object {name : My Object,getNameFunc : function(){return function(){return this.name;};} }; alert(object.getNameFunc()());代码片段二。 var name The Window; var object {name : My Object,getNameFunc : function(){var that this;return function(){return that.name;};} }; alert(object.getNameFunc()());第一个 打印结果为The window 第二个 打印结果为My Object this是由它所在函数调用时的环境决定的而不是由它所在函数定义的环境决定的。 第一个this是在调用闭包时确定的环境是全局环境 第二个this是在调用getNameFunc时确定的环境是object内 二、rust闭包 rust闭包跟javascript闭包原理基本一样。就语法格式不一样。 rust闭包没有名字包含于一个函数内。 所以可以直接认为rust闭包是一个没有函数名的内联函数。 一定义闭包 它的定义语法如下 |parameter| {// 闭包的具体逻辑 }闭包不要求在参数和返回值上注明类型 例子 |x: u32| - u32 { x 1 } |x| { x 1 } |x| x 1 闭包虽然没有名称但我们可以将闭包赋值给一个变量 let closure_function |parameter| {// 闭包的具体逻辑 }二使用闭包 1.使用小括号 () 来调用闭包 closure_function(parameter);范例 fn main(){let is_even |x| {x%20};let no 13;println!({} is even ? {},no, is_even(no)); } 编译运行结果如下 13 is even ? false2.直接访问父作用域中的变量 也叫捕获变量。闭包周围的作用域被称为环境 不必通过传参的方式而是直接访问环境中的变量 范例 fn main(){let val 10;// 访问外层作用域变量vallet closure2 |x| {x val // 内联函数访问外层作用域变量};println!({}, closure2(2)); } 编译运行结果如下 12Fn系列trait由标准库提供。所有的闭包都实现了Fn、FnMut、FnOnce中的一个。 闭包可以通过三种方式捕获其环境中的变量 获取所有权可变借用和不可变借用。这三种方式被编码为如下三个trait FnOnce消耗捕获的变量。为了消费捕获到的变量闭包必须获取其所有权并在定义闭包时将其移动进闭包。Once代表了闭包不能多次获取相同变量的所有权所以它只能被调用一次。FnMut获取可变的借用值所以可以改变其环境Fn从其环境获取不可变的借用值 当你创建闭包时Rust 会根据闭包使用环境中变量的方式来自动推导出它们需要使用的 trait。所有闭包都自动实现了 FnOnce因为它们至少都可以被调用一次。那些不需要移动被捕获变量的闭包还会实现 FnMut而那些不需要修改被捕获变量的闭包则同时实现了Fn。 如果你希望强制闭包获取所有权可以在参数列表前使用move关键字。关键字move通常用于允许闭包比其捕获的值活得更久例如返回闭包或用于生成新线程。 例子 fn main() {let x vec![1, 2, 3];let equal_to_x move |z| z x;println!(cant use x here: {:?}, x);//编译错误let y vec![1, 2, 3];assert!(equal_to_x(y)); }x被移动进了闭包因为闭包使用move关键字定义。接着闭包获取了x的所有权同时main就不再允许在println! 语句中使用x了。去掉println! 即可修复问题。 复合类型如结构体始终是全部捕获的而不是各个字段分开捕获的。如果真要捕获单个字段那可能需要先借用该字段到本地局部变量中 struct SetVec {set: HashSetu32,vec: Vecu32 } impl SetVec {fn populate(mut self) {let vec mut self.vec;self.set.iter().for_each(|n| {vec.push(n);})} }相反如果闭包直接使用了self.vec那么它将尝试通过可变引用捕获self。但是因为self.set已经被借出用来迭代了所以代码将无法编译。
http://www.yutouwan.com/news/381328/

相关文章:

  • 嘉兴响应式网站云南机场建设集团网站
  • 做sgs认证的公司网站直播是网站怎么做
  • 湖北网站开发培训千锋培训机构官网
  • 网站开发课题开发背景主流建站开源程序有哪些
  • 如何将自己做的网站放到网上wordpress媒体库无法显示
  • 学校网站网页建设开题报告书网站建设需要具备的能力
  • 深圳网站制作要多少钱做网站公司多少钱
  • 页面设计制作网站源码莱西网站制作联赛与超
  • 网站宣传推广平台asp做的网站怎么运行
  • 个人网站备案 网站服务内容英文网站建设费用
  • 宁波本地网站排行意派h5制作平台
  • 配送网站开发景德镇网站制作公司
  • 找个美工做淘宝网站需要多少钱网站建设与运营课程
  • 手机网站横幅制作模板wordpress做分类信息网站
  • 商务网站建设流程步骤阿里云商业网站建设视频
  • 免费企业电话名录手机优化系统
  • 网站同时做竞价和seowordpress撤销更改
  • 租赁空间网站建设建设网站过程中
  • 推广型网站建设销售吉林省交通建设集团有限公司网站
  • 夏天做啥网站致富免费下载微信并安装
  • 网络营销发展的新趋势东莞百度推广优化
  • 怎样优化排名自己网站枣庄网站建设哪家公司好
  • 网站运营有前途吗wordpress 获取文章列表
  • 福州网站建设市场搜索引擎下载入口
  • 站内营销推广方案软件商店安装下载
  • 镇江网站建设介绍服务搜索引擎优化seo专员招聘
  • 网站建设个一般需要花费多少钱网站建设报表明细
  • 国外有趣的网站wordpress 猜你喜欢
  • 网站开发毕设开题报告怎么写实验建设网站 南京林业大学
  • 做一个网站后期维护需要多少钱网站 用户体验