1.什么是闭包,闭包的作用是什么?
- 变量的作用域包括全局变量和局部变量。
Javascript语言中,函数内部可以直接读取全局变量。然而在函数外部无法读取函数内的局部变量。如何使函数外部读取函数内部的局部变量,在函数f1内部在增加一个函数f2,这样f2对于f1来说就是函数内部,可以访问f1了。此时的f2就是闭包。 - 闭包是指有权访问另一个函数作用域中的变量的函数。在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
- 闭包的用途:
1.可以读取函数内部的变量;
2.让这些变量的值始终保持在内存中。
function f1(){
var n=1;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 1
nAdd();
result(); // 2
- 以上这个例子说明函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。这是因为f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
参考:学习Javascript闭包
2.setTimeout 0 有什么作用? - setTimeout用来指定某个函数或某段代码,在多少毫秒之后执行。setTimeout()接受两个参数,第一个是回调函数,第二个是推迟执行的毫秒数。
console.log(1);
setTimeout(function(){console.log(2);},1000);
console.log(3);//输出的结果:1 3 2
如果将setTimeout()的第二个参数设为0,就表示当前代码执行完(执行栈清空)以后,立即执行(0毫秒间隔)指定的回调函数。换句话说,就是要等当前脚本的同步任务和“任务队列”中已有的事件,全部处理完以后,立马执行setTimeout()。
例如:
setTimeout(function(){console.log(1);}, 0);
console.log(2);//执行结果总是2,1
网友评论