js闭包

作者: 爱上帘外修竹 | 来源:发表于2016-06-27 18:06 被阅读0次
1. 什么是闭包? 有什么作用

一个函数的执行结果为返回了另一个函数,如:
function A(){ function B(){ console.log('hello world') } return B; } var C=A(); C(); 函数A的内部变量B被A外部的变量C引用,形成了闭包

2. setTimeout 0 有什么作用

待执行的语句延迟时间为0,但是待执行语句将在本段代码的末尾执行

代码题

1. 下面的代码输出多少?修改代码让fnArri输出 i。使用两种以上的方法

var fnArr = []; for (var i = 0; i < 10; i ++) { fnArr[i]=function(){ return i; } } console.log( fnArr[3]() ); // 10
代码修改如下:
1#
var fnArr = []; for (var i = 0; i < 10; i ++) { fnArr[i]=function(j){ function fn(){ return j; } return fn; }(i); } console.log( fnArr[3]() ); // 3
2#
var fnArr = []; for (var i = 0; i < 10; i ++) { fnArr[i]=function(){ return arguments.collee.index; } fnArr[i].index=i; } console.log( fnArr[3]() ); // 3

2. 使用闭包封装一个汽车对象,可以通过如下方式获取汽车状态

var Car =( function(){ var Speed=0; function setSpeed(Sp){ Speed=Sp; } function getSpeed(){ console.log(Speed); } function accelerate(){ Speed+=10; } function decelerate(){ Speed-=10; } function getStatus(){ return Speed>0? 'running':'stop'; } return { setSpeed: setSpeed, getSpeed: getSpeed, accelerate: accelerate, decelerate: decelerate, getStatus: getStatus } }() ) Car.setSpeed(30); Car.getSpeed(); //30 Car.accelerate(); Car.getSpeed();//40; Car.decelerate(); Car.decelerate(); Car.getSpeed(); //20 Car.getStatus(); // 'running'; Car.decelerate(); Car.decelerate(); Car.getStatus(); //'stop'; //Car.speed; //error

3. 写一个函数使用setTimeout模拟setInterval的功能

function setInterval2(fn, intv) { setTimeout(function() { fn(); setInterval2(fn, intv); }, intv); }

4. 写一个函数,计算setTimeout最小时间粒度

function getLi(){ var i=0; var start=Date.now(); var clock=setTimeout( ( function(){ i++; if(i==1000){ clearTimeout(clock); var end=Date.now(); console.log( (end-start)/i) } setTimeout( arguments.callee,0) }),0) } getLi();

5. 下面这段代码输出结果是? 为什么?

var a = 1; setTimeout(function(){ a = 2; console.log(a); }, 0); var a ; console.log(a); a = 3; console.log(a);
由于setTimeout的作用,以上代码相当于:
var a = 1; a=1 ; console.log(a); // 1 a = 3; console.log(a); //3 (function(){ a = 2; console.log(a);//2 }());

6. 下面这段代码输出结果是? 为什么?

var flag = true; setTimeout(function(){ flag = false; },0) while(flag){} // 由于setTimeout延迟执行,flag为true,while陷入死循环 console.log(flag);

7. 下面这段代码输出?如何输出delayer: 0, delayer:1...

(使用闭包来实现)
for(var i=0;i<5;i++){ setTimeout(function(){ console.log('delayer:' + i ); }, 0); console.log(i); } // 0 // 1 // 2 // 3 // 4 // delayer:5 // delayer:5 // delayer:5 // delayer:5 // delayer:5
如下:
for(var i=0;i<5;i++){ setTimeout( (function(j){ console.log('delayer:' + j ); }(i) ), 0); console.log(i); }
本文版权归本人(帘外修竹)所有,转载须说明来源

相关文章

  • php之闭包函数(Closure)

    php闭包函数(Closure) JS闭包 js和php闭包使用和区别

  • JS闭包

    JS闭包 闭包练习

  • JS闭包问题(二)

    在之前的JS闭包问题(一)文章中大概介绍了一下JS闭包,同时讲了闭包与变量之间的问题,今天我们继续聊闭包,聊聊闭包...

  • JS闭包大结局(JS闭包系列3)

    在上一篇中再谈JS闭包(JS闭包系列2),我详细的介绍了JS中的变量作用域相关的概念,结合第一节关于JS闭包(JS...

  • JS闭包入门

    最近有看到朋友的面经里提到的JS闭包的问题,就想研究研究,以下是我对JS闭包的简单理解。 到底什么是JS闭包? 定...

  • 学习JavaScript闭包和作用域笔记

    JS JavaScript闭包和作用域 闭包 JavaScript高级程序设计中对闭包的定义:闭包是指有权访问另外...

  • 再谈JS闭包(JS闭包系列2)

    这篇文章,来继续谈谈Javascript闭包的剩余问题。因为在上一篇文章中关于JS闭包(JS闭包系列1)主要简单的...

  • 简单的聊一下闭包

    js中的闭包 闭包是学习js中永远也绕不过去的一个坎,那么,今天我们就去一段简单的代码开始聊一聊闭包 什么是闭包 ...

  • 浅谈闭包

    js中的闭包 闭包是学习js中永远也绕不过去的一个坎,那么,今天我们就去一段简单的代码开始聊一聊闭包 什么是闭包 ...

  • 闭包??

    什么闭包,闭包有什么用?http://js.jirengu.com/pogadikofa/1/闭包是在某个作用域内...

网友评论

      本文标题:js闭包

      本文链接:https://www.haomeiwen.com/subject/jzgadttx.html