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

网站建设开发计划模板北京网站设计方案

网站建设开发计划模板,北京网站设计方案,wordpress有广告,无锡高端网站建设咨询对闭包的理解 闭包是内层函数使用外层变量 (子级可以访问父级的变量,但是父级不可以访问子级的) 闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,创建的函数可以访问到当前函数的局部…

对闭包的理解

闭包是内层函数使用外层变量
(子级可以访问父级的变量,但是父级不可以访问子级的)

闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,创建的函数可以访问到当前函数的局部变量。

闭包有两个常用的用途;

  • 闭包的第一个用途是使我们在函数外部能够访问到函数内部的变量。通过使用闭包,可以通过在外部调用闭包函数,从而在外部访问到函数内部的变量,可以使用这种方法来创建私有变量。
  • 闭包的另一个用途是使已经运行结束的函数上下文中的变量对象继续留在内存中,因为闭包函数保留了这个变量对象的引用,所以这个变量对象不会被回收。
    这是因为 JavaScript 的垃圾回收机制会检查对象是否还被引用,如果没有引用,则认为该对象是垃圾,可以被回收。而闭包的内部函数可能会继续访问外部函数的变量。只有当闭包函数本身也被销毁时,其引用的外部作用域才会被释放。
    比如,函数 A 内部有一个函数 B,函数 B 可以访问到函数 A 中的变量,那么函数 B 就是闭包。
function A() {let a = 1;window.B = function () {console.log(a);};
}
A();
B(); // 1

面试真题

1. 基础题

在 JS 中,闭包存在的意义就是让我们可以间接访问函数内部的变量。经典面试题:循环中使用闭包解决 var 定义函数的问题

for (var i = 1; i <= 5; i++) {setTimeout(function timer() {console.log(i);}, i * 1000);
}

首先因为 setTimeout 是个异步函数,所以会先把循环全部执行完毕,这时候 i 就是 6 了,所以会输出一堆 6。解决办法有三种:

  • 第一种是使用闭包的方式
for (var i = 1; i <= 5; i++) {(function (j) {setTimeout(function timer() {console.log(j);}, j * 1000);})(i); // 把i作为参数传递给前面括号里的j
}

使用立即执行函数包裹 setTimeout 的回调函数,能够创建一个闭包
在上述代码中,首先使用了立即执行函数i 传入函数内部,这个时候值就被固定在了参数 j 上面不会改变,当下次执行 timer 这个闭包的时候,就可以使用外部函数的变量 j,从而达到目的。

  • 第二种就是使用 setTimeout 的第三个参数,这个参数会被当成 timer 回调函数的参数传入。
for (var i = 1; i <= 5; i++) {setTimeout(function timer(j) {console.log(j);},i * 1000,i);
}
  • 第三种就是使用 let 定义 i 了来解决问题了,这个也是最为推荐的方式
for (let i = 1; i <= 5; i++) {setTimeout(function timer() {console.log(i);}, i * 1000);
}

2. 变形题

/* TASK A1In the following code, what will be printed to console if a user clicks the first and fourth button? Why?
*/var nodes = document.getElementsByTagName("button");for (var i = 0; i < nodes.length; i++) {nodes[i].addEventListener("click", function () {console.log("You clicked element #" + i);});}

输出的是 nodes.length的值;

因为var生命的是函数作用域

解决:
方法1:let
方法2:闭包

 var nodes = document.getElementsByTagName("button");for (var i = 0; i < nodes.length; i++) {(function (i) {nodes[i].addEventListener("click", function () {console.log("You clicked element #" + i);});})(i);}
http://www.yayakq.cn/news/160467/

相关文章:

  • 塘沽建设网站公司网站建设的管理
  • 网站建站 上海wordpress与知更鸟
  • 精品课程网站建设的背景及意义wordpress快速仿站
  • 基于5G的网站设计asp课程设计企业网站设计
  • 电器网站建设济南网站优化分析
  • 珠海网站怎样建设承德教育信息网官网
  • 网站建设名词开源crm
  • 电商网站 投诉在线生成头像
  • 如何修改网站模板内容wordpress实时交流插件
  • 西瓜网络深圳网站建设 东莞网站建设备案 个人网站
  • wordpress怎么做激活验证网站文章优化怎么做
  • 做羞羞事网站wordpress的首页
  • 哪个网站做签约设计师比较好连接外国的网站吗
  • 广西微信网站建设php jsp开发网站开发
  • 企业站点个人网站logo
  • 网站开发语言版本不同wordpress 适配 meta
  • 有的网站用流量打不开wordpress数据库的设置
  • ui设计师的网站江西省城乡建设厅网站证件查询
  • 椒江做阿里巴巴网站的公司郑州便宜网站建设报价
  • wordpress发布文章提示失败江门关键词排名优化
  • 网站建设 经济效益网络营销专业技能
  • 企业建设网站的意义百度权重概念
  • 南皮县网站建设学什么可以先做网站
  • 添加网站备案号链接专业的营销型网站制作
  • 公众微信网站建设网站seo其应用
  • 江苏响应式网站建设哪里有中铁建设集团华北分公司网站
  • 南京网站开发南京乐识优网易企业邮箱登录入口手机
  • 手机网站建设怎样婚庆公司网站建设
  • 建设一个大型电影网站费用自适应网站设计规范
  • 阿里巴巴国内网站怎么做网页查询ip地址