闭包,定时器

问题

1.什么是闭包? 有什么作用

闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。
在函数内定义的变量,在其内部返回函数,返回的函数使用函数定义的变量,就会形成闭包;闭包可以减少全局变量,还可以对函数进行封装;
下面例子形成了简单的闭包

function f1() {
       var a=10;
       var b=20;
       function f2() {
           console.log(a);
       }
       f2();
   }
   f1();

应用更多的形式:

function f1() {
       var a=10;
       var b=20;
       return function f2() {
           console.log(a);
       }
       
   }
   var result=f1();
   console.log(result());

2.setTimeout 0 有什么作用

使用setTimeout 0可以实现异步,可以等待当前任务完成之后,在执行setTimeout 0里面函数的内容,因为javascript是单线程执行代码的,无法同时执行多段代码,所以当一个代码执行的时候,后续的代码必须等待,形成一个队列,一旦当前任务执行完毕,才从队列中取出下面的一个任务执行,使用seTimeout 0就是利用了这个特性来延迟执行顺序。

代码题

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

    var fnArr = [];
    for (var i = 0; i < 10; i ++) {
        fnArr[i] =  function(){
            return i;
        };
    }
    console.log( fnArr[3]() );  //

输出10;
方法一:

var fnArr = [];
    for (var i = 0; i < 10; i++) {
        fnArr[i] = (function(num) {
            return function() {
                return num;
            }
        })(i);
    }
    console.log(fnArr[9]()); //

方法二:

function f() {
        function test(x) {
            return function() {
                return x;
            }
        }
        var a = [];
        for (var i = 0; i < 10; i++) {
            a[i] = test(i);
        }
        return a;
    }
    var fnArr = f();
    console.log(fnArr[9]()); //

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

var Car = //todo;
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
var Car = (function() {
        var speed = 0;
        var status = 'stop';
        var acceleratevalue = 10;
        var deceleratevalue = -10;

        function getSpeed() {
            console.log(speed);
        }

        function setSpeed(num) {
            speed = num;
            console.log(speed);
        }

        function accelerate() {
            speed += acceleratevalue;
            console.log(speed);
        }

        function decelerate() {
            speed += deceleratevalue;
            console.log(speed);
        }

        function getStatus() {
            status = speed > 0 ? 'running' : 'stop';
            console.log(status);
        }
        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的功能

var i=0;
function interval(){
    setTimeout(function(){
        console.log(i++);
        interval();
    },1000);
}
interval();

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

function getMini() {
        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);
            }
            clock = setTimeout(arguments.callee, 2)
        }, 2)
    }

    console.log(getMini())

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

var a = 1;
setTimeout(function(){
    a = 2;
    console.log(a);
}, 0);
var a ;
console.log(a);
a = 3;
console.log(a);

setTimeout函数放在其他语句后面执行,输出1,3,2

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

var flag = true;
setTimeout(function(){
    flag = false;
},0)
while(flag){}
console.log(flag);

//无限循环没有输出。flag的初始值为true,而setTimeout的delay值被设为0,也就意味着里面的函数要等待其他语句全部执行完毕才会运行。而while(flag){}因为flag为true的关系永远不会停止,所以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:4
delayer:4
delayer:4
delayer:4
delayer:4

输出delayer: 0, delayer:1...

for (var i = 0; i < 5; i++) {
        setTimeout(
            (function(num) {
                return function() {
                    console.log('delayer:' + num);
                }
            })(i), 0);
        console.log(i);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 问题 一、什么是闭包? 有什么作用? 闭包闭包就是能够读取其他函数内部变量的函数。在javascript中,只有函...
    婷楼沐熙阅读 561评论 0 0
  • 1.什么是闭包? 有什么作用 定义:闭包就是嵌套在函数里面的内部函数,并且该内部函数可以访问外部函数中声明的所有局...
    饥人谷区子铭阅读 851评论 0 2
  • 本教程版权归小圆和饥人谷所有,转载须说明来源 问题 什么是闭包? 有什么作用闭包(closure)是指有权访问另一...
    饥人谷__小圆阅读 472评论 0 0
  • 1.什么是闭包? 有什么作用 闭包指有权访问另一个函数作用域的变量的函数。创建闭包的常见方式 是 在一个函数...
    JunVincetHuo阅读 1,315评论 0 2
  • 问答 1.什么是闭包? 有什么作用? 闭包 简而言之 就是让函数外部可以访问函数内的局部变量,就是将函数内部和函数...
    我是小韩阅读 287评论 1 0