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-* 属性被设计来存储数据,而不被绑定到
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。