---------------------------------------------------闭包 详细解释与举例2------------------------------------------------------------
应用
循环中的异步
循环绑定事件
var ali = document.querySelectorAll("li");
for(var i=0;i<ali.length;i++){
(function(index){ //每循环一次 执行一次匿名函数
ali[index].onclick = function(){ //索引用参数传递 匿名函数每次执行都单独生成一个作用域保存索引
// 独立作用域 保证保存的变量不被循环修改
console.log(index); //每次点击 打印自己的索引
}
})(i) //( 传实参 index接收)
};
//https://blog.csdn.net/hpasdabc?spm=1000.2115.3001.5343
//变量保存在匿名函数的作用域 匿名结束就清空 没有全局变量
for(let i=0;i<ali.length;i++){
ali[i].onclick = function(){
console.log(i);
}
}
let触发块级作用域 在{}中用let声明变量 会变成{}的局部变量 循环的{}产生多个作用域保存变量
从外部给回调函数传参 (例:计时器传参 事件委托的封装)
直接()传参 函数立即执行 不等待计时 函数返回值是什么?undefined(没有return的东西)
setTimeout(fn("hahahah"),5000);
function fn(str){
return function(){ 参数暂时保存到返回的函数上
console.log(str);
}
}
函数立即执行 得到结果是一个小函数 小函数延时后执行 结果不变但是参数str传递
---------------------------------------------------------------------------------------------------------------
函数分为 定义上下文 执行上下文(this)闭包核心 作用域链
函数执行 函数内部可以拿到自己定义上下文中的变量
var a = 10;
function fn(){
var a = 20;
return function(){console.log(a)} //20
}
//在全局拿不到局部的变量a=20 f()在全局执行怎么使用局部变量a ==> 作用域链
//https://blog.csdn.net/hpasdabc?spm=1000.2115.3001.5343
var f = fn(); //经过return f实际是匿名函数
f(); // 匿名函数的定义上下文 是fn的作用域 f可以获得fn范围内的变量
为什么a不是10
就近原则,
js会先查找自己有没有这个变量,如果有,就用自己的,如果没有就向上级查找,上级还是没有就到上上级去查找,如此循环,在哪找到,就在哪停止。如果全都没有,就返回undefined。
---------------------------------------------------------------------------------------------------------------
面试
内存溢出是什么 内存容量不足
内存溢出可能的原因 死循环 闭包 容量不足