JavaScript引擎的内部运行机制

http://www.ruanyifeng.com/blo...

JavaScript是单线程

作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题

任务队列

单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着
同步任务(synchronous)指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;
异步任务(asynchronous)指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行
req.send方法是Ajax操作向服务器发送数据,它是一个异步任务,意味着只有当前脚本的所有代码执行完,系统才会去读取"任务队列"

返回函数

function func(x,y){
   var value=300;
   return function(){
    return value+x+y;
  };
}
console.info(func(100,200)());//600  

参数

var values = [ 213, 16, 2058, 54, 10, 1965, 57, 9 ];
values.sort(function(value1,value2){return value2 - value1; });

this

window.color = "red";
var o = { color: "blue" };
function  sayColor(){
    alert(this.color);
}
sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue

闭包(closure)

http://www.ruanyifeng.com/blo...
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量
函数外部自然无法读取函数内的局部变量
**函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

闭包的用途

,一个是前面提到的可以读取函数内部的变量,
另一个就是让这些变量的值始终保持在内存中

function a() {
    var i = 0;//局部变量
    return function b() { //a是b的父函数,b被赋给一个全局变量,导致b始终在内存中,而a依赖于b,因此a也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
      console.info(++i);
    };
};
var c = a();
for (var i = 0; i < 10; i++) {
    c();
}

节流函数

function delayFn2 (fn, delay, mustDelay){
     var timer = null;
     var t_start;
     return function(){
         var context = this, args = arguments, t_cur = +new Date();
         //先清理上一次的调用触发(上一次调用触发事件不执行)
         clearTimeout(timer);
         //如果不存触发时间,那么当前的时间就是触发时间
         if(!t_start){
             t_start = t_cur;
         }
         //如果当前时间-触发时间大于最大的间隔时间(mustDelay),触发一次函数运行函数
         if(t_cur - t_start >= mustDelay){
             fn.apply(context, args);
             t_start = t_cur;
         }
         //否则延迟执行
         else {
             timer = setTimeout(function(){
                 fn.apply(context, args);
             }, delay);
         }
     };
}
var count=0;
function fn1(){
    count++;
    console.log(count)
} 
//100ms内连续触发的调用,后一个调用会把前一个调用的等待处理掉,但每隔200ms至少执行一次
document.onmousemove=delayFn2(fn1,100,200)

钩子函数

使用data-*属性作为JS钩子,是不正确的。
data-*属性,根据规范,用于存储自定义的数据隐私的页面或应用程序
data-* 属性被设计来存储数据,而不被绑定到


jh2k15
199 声望5 粉丝

« 上一篇
processing基础
下一篇 »
自适应网页