js难点理解

闭包

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

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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  •   JavaScript 是一种极其灵活的语言,具有多种使用风格。   一般来说,编写 JavaScript 要么...
    霜天晓阅读 4,140评论 0 0
  • 15、正则 正则就是一个规则,用来处理字符串的规则1、正则匹配编写一个规则,验证某个字符串是否符合这个规则,正则匹...
    萌妹撒阅读 5,395评论 0 1
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,906评论 0 4
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,911评论 1 32
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 13,175评论 0 3

友情链接更多精彩内容