JS闭包、定时器

2016-07-17  本文已影响110人  coolheadedY
var scope = "global scope";
        function checkScope() {
            var scope = "local scope";
            function f() {
                return scope;
            }
            return f;
        }
        checkScope();//function f() { return scope; }
        checkScope()();//"local scope"
var inc = (function() {
            var a = 0;
            return function() {
                return a++;
            }
        })();
inc();
setTimeout(function(){}, 0)
var fnArr = [];
             for (var i = 0; i < 10; i ++) {
             fnArr[i] =  function(){
                  return i;
             };
        }
        console.log( fnArr[3]() );  //10
 console.log("方法一");
         var fnArr = [];
             for (var i = 0; i < 10; i ++) {
             fnArr[i] =  (function() {
                var n = i;
                return function() {
                    return n;
                }
             })();
         }
        console.log( fnArr[3]() );
//------------------------------
        console.log("方法一改");
         var fnArr = [];
             for (var i = 0; i < 10; i ++) {
             fnArr[i] =  (function(n) {
                return function() {
                    return n;
                }
             })(i);
         }
        console.log( fnArr[3]() );
//------------------------------
        console.log("方法一改1");
         var fnArr = [];
         function fn(n) {
            return function() {
                return n;
            }
         }
             for (var i = 0; i < 10; i ++) {
             fnArr[i] = fn(i);
        }
        console.log( fnArr[3]() ); 
//------------------------------
        console.log("方法二");
        var fnArr = [];
             for (var i = 0; i < 10; i ++) {
             (function(n) {  
                fnArr[i] = function(){
                  return n;
                }
            })(i);
        }
        console.log( fnArr[3]() );
//------------------------------
        console.log("方法二改");
        var fnArr = [];
             for (var i = 0; i < 10; i ++) {
             (function() {
                var n = i;  
                fnArr[i] = function(){
                  return n;
                }
            })();
        }
        console.log( fnArr[3]() );
        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 status = "";
            var speed = 0;
            return {
                setSpeed: function(num) {  speed = num; },
                getSpeed: function() { return speed; },
                accelerate: function() {  speed += 10; },
                decelerate: function() {  speed -= 10; },
                getStatus: function() {
                    if (speed > 0) {
                        status = "runing";
                    } else {
                        status = "stop";
                    }
                    return status;
                }
            }
        })();//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 a = 0;
        setTimeout(function(){
            console.log(++a);
            setTimeout(arguments.callee, 1000);
        }, 0);
        var a = 0;
        function intv() {
            setTimeout(function() {
                console.log(a++);
                intv();
            },1000);
        }
        intv();
        (function (){
            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, 0);
            }, 0);
        })();//5
        var a = 1;
        setTimeout(function(){
            a = 2;
            console.log(a);
        }, 0);
        var a ;
        console.log(a);
        a = 3;
        console.log(a);
结果:
//1   setTmineout延迟到最后执行a第一次执行为1
//3   a被赋值为3。
//2   当之前的事件程序全部执行完成执行setTimeout(),a被赋值为2并输出。
当setTimeout(func(), delay)中的delay设置为0时函数将会在前面的事件处理程序全部执行完成后才立即执行。
        var flag = true;
        setTimeout(function(){
            flag = false;
        },0)
        while(flag){}
        console.log(flag);
        for(var i=0;i<5;i++){
            setTimeout((function(n){
                return function() {
                     console.log('delayer:' + n );
                }
            })(i), 0);
            console.log(i);
        }

apply,call用法,实现bind
本博客版权归 本人和饥人谷所有,转载需说明来源

上一篇 下一篇

猜你喜欢

热点阅读