js难点理解

2019-09-26  本文已影响0人  最好的自己_3d47

闭包

含义:有权访问另一个函数作用域的变量的函数
创建方式:在一个函数内部创建另一个函数

function createFunctions(){
    var result=[];
    for(var i=0;i<10;i++){
      result[i]=function(){
          return i;
       }
   }
  return result;
}
console.log(createFunctions()[1]())
//表面上看,每个函数都应该返回自己的索引值,即位置0对应0,位置1对应位置1,但实际上每个函数都返回10。
//因为每个函数作用域链中都保存着createFunctions()函数的活动对象,所以引用的都是同一个变量i;
//或者换个说法,result[i]=function(){}中的i使用的是外部的i,是个全局变量
`解决方法`
function createFunctions(){
    var result=[];
    for(var i=0;i<10;i++){
      result[i]=function(num){
          return function(){
            return num;
          }
       }(i);     //将i作为参数传入,num就是接收的变量
   }
  return result;
}

this对象

含义:运行时基于函数的执行环境绑定的:在全局函数中this相当于window
注意点:匿名函数的执行环境具有全局性,因此this对象指向window


      var name='小鱼';
       var obj={
               name:'小二',
               getName:function(){
                     return this.name;
               }
       }

console.log(obj.getName()())    //得到的小鱼,因为是匿名函数,这里的this指向window

定时器

1.高级定时器

javascript是运行于单线程环境中的,而定时器只是表示在多长时间后加入队列。出来主Javascript执行进程外,还有一个需要在进程下一次空闲时执行的代码队列

例子:
btn.onclick=function(){
    setTimeout(function(){
          console.log(111);
    },250)
}     //点击按钮后,经过250ms后,指定的代码添加到队列中等待执行。队列中的所有代码都要等到javascript进程空闲后才能执行,所以有一些页面倒计时一般不放在前端进行。

2.重复的定时器

setInterval():多次定时。
重复定时器存在的两个问题:1.某些间隔会被跳过;2.多个定时器的代码执行之间的间隔会比预期的小。
例:每隔200ms添加到队列,第一个205ms,第二个405ms处,第三个605ms,加入605ms时,第一个定时器的代码仍在运行,同时队列中已经添加了第二个定时器代码的实例,所以在605ms处,这个时间点的定时器代码不会被加入队列中,而当第一个定时器的代码结束,第二个定时器代码会立即执行,所以定时器代码时间间隔比较小.

解决方法:
function sendTime(){
    var i=0;
    setTimeout(function(){
      i++;
      console.log(i);
      setTimeout(arguments.callee,1000);   //来获取对当前函数的引用,但是在严格模式下会报错,将arguments.callee改为函数sendTime()
    },1000)
}

这样做的好处是在前一个定时器代码执行完之前,不会相对列加入新的代码,确保了不会有任何的缺失间隔,而且保证在下一次定时器代码执行之前,至少要等待指定的间隔

3.如何判断一个对象为空

var obj={};
console.log(JSON.stringify(obj)=='{}');
console.log(Object.keys(obj).length==0)
上一篇 下一篇

猜你喜欢

热点阅读