当函数在被使用时就不删除(回收)
内层的数据被使用,外层的数据也不删
function fn(){
let n = 1
return function(){
let m = 1
return function () {
console.log('n:' + ++n)
console.log('m:' + ++m)
}
}
}
let a = fn()();
a() //n:2 m:2
a() //n:3 m:3
构造函数
function FN(){
let n = 1
this.sum (){
console.log('n:' + ++n)
}
}
相当于:
function FN(){
let n = 1
function sum (){
console.log('n:' + ++n)
}
return {
sum: sum
}
}
let a = new FN() //sum被使用,不删
a.sum() //n:2
a.sum() //n:3
a.sum() //n:4
let b = new FN() //新内存空间
b.sum() //n:2
b.sum() //n:3
for--异步与作用域
// 输出十个 10
for (var i = 0; i < 10; i++) {
setTimeout(function(){
console.log(i);
})
}
// 输出 0123456789
for (let j = 0; j < 10; j++) {
setTimeout(function(){
console.log(j);
})
}
- 异步
1 JS是单线程环境.
2 对于同步和异步, 先执行同步代码, 碰到异步的代码会将其插入到任务队列当中等待, 直到同步代码执行完毕,才执行异步代码
3 setTimeout是延时,比如上面这段代码中,第二个参数延时时间是0,也就是说执行到它的时候会在0ms之后将它插入到任务队列当中。(此时setTimeout里的回调没有执行)
4 同步代码都执行完成之后,那么JS引擎就空闲了,这个时候就轮到任务队列中的异步代码依次加载了。
- 作用域
立即执行函数?, 其实是赋值与调用
for(var i=1;i<10;i++){
(function(a){
setTimeout(function(){console.log(a);},10000);
})(i)
}
//十秒之后,立刻输出1 2 3 4 5 6 7 8 9(中间无间隔)
//与立即执行函数无关,其实是将i的值保存到函数内的局部变量里了
for(var i=1;i<10;i++){
function fn(a){
setTimeout(function(){console.log(a);},10000);
}
fn(i)
}