JS Q&A小记录

来源:互联网 发布:然后变风发乎情的呼 编辑:程序博客网 时间:2024/05/27 00:49
  • 变量、函数–声明与表达式

      变量声明和函数声明会提升到该函数或外部函数作用域的顶部,函数声明优先级高于变量声明。但是变量的赋值会留在原位。所以函数声明的函数可以被提前引用,但是变量提前引用会被判定为undefined。
      注意ES6标准,用let声明的变量只在所在代码块中有效而且不会被提升。
      而函数定义表达式中,函数的声明虽然也会提前,但是赋值并不能提前,所以该函数无法在表达式定义之前被引用。
       函数与变量同名,且函数声明在先时,如果变量有赋值,则函数声明被覆盖,若没有赋值,则变量声明被忽略。

  • 算术运算符 

      +:字符串优先
       -:数值优先

  • Event Loop

      js的一大特点是单线程,这意味着所有的任务都需要排队执行。任务分为同步和异步两种类型。
       js中的同步不同于其他语言的同步(多线程),是指按照代码顺序执行任务。
       1.同步任务执行时生成一个执行栈。
       2.异步任务是不进入主线程的。只要异步任务有了运行结果,就在”任务队列”之中放置一个事件。
       3.一旦”执行栈”中的所有同步任务执行完毕,系统就会读取”任务队列”,看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
       “任务队列”是一个事件的队列,IO设备和用户产生事件都会在“任务队列”中添加一个事件。只要指定过回调函数,这些事件发生时就会进入”任务队列”,等待主线程读取。异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行对应的回调函数。
      除了放置异步任务的事件,”任务队列”还可以放置定时事件,即指定某些代码在多少时间之后执行。这叫做”定时器”(timer)功能,也就是定时执行的代码。
      定时器功能主要由setTimeout()和setInterval()这两个函数来完成。setTimeout()接受两个参数,第一个是回调函数,第二个是推迟执行的毫秒数。如果将setTimeout()的第二个参数设为0,就表示当前代码执行完(执行栈清空)以后,立即执行(0毫秒间隔)指定的回调函数。
      总之,setTimeout(fn,0)的含义是,指定某个任务在主线程最早可得的空闲时间执行,也就是说,尽可能早得执行。它在”任务队列”的尾部添加一个事件,因此要等到同步任务和”任务队列”现有的事件都处理完,才会得到执行。HTML5标准规定了setTimeout()的第二个参数的最小值(最短间隔),不得低于4毫秒,如果低于这个值,就会自动增加。
      以上内容参考阮一峰大大写的博客

    http://www.ruanyifeng.com/blog/2014/10/event-loop.html

0 0
原创粉丝点击