<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
// 作用域:
// 一切对象都有属性
// test.[[scope]]存储一个作用域,隐式的属性,不可访问
// 多次调用函数会创建多个执行上下文,每次执行完以后都会销毁,下一次重现创建
// function a(){
// function b(){
// var b = 234;
// }
// var a = 123;
// b();
// }
// var glob = 100;
// a();
// 创建 a.[[scope]] ----> 0:GO{}
// 执行 a.[[scope]] ----> 0:AO{} 1:GO{}
// 查找变量:从顶端查找到低端
// function a(){
// function b(){
// var bbb = 234;
// console.log(aaa);
// }
// var aaa = 123;
// return b;
// }
// var glob = 100;
// var demo = a();
// demo();
// 内部的函数保存到外部一定会生成闭包
// 闭包-eg1.
// function a(){
// var num = 100;
// function b(){
// num ++;
// console.log(num);
// }
// return b;
// }
// var demo = a();
// demo(); //101
// demo(); //102
// 闭包:当内部函数保存到函数外部的时候会产生闭包。闭包将会导致原有的作用域链不释放,从而导致内存泄漏。
// 闭包的作用: 1.实现公有变量 2.可以做缓存(存储结构) 3.可以实现封装,属性私有化 4.模块化开发,防止污染全局变量
// 立即执行函数:此类函数没有声明,使用过一次之后就会释放。针对初始化功能的函数。有函数拥有的一切都东西
// 只有表达式才能被执行符号执行。能被执行符号执行的表达式,这个函数的名字就被自动忽略。
// 立即函数的使用:
// 1. (function (形参) {} (实参)); W3C建议使用第一种
// 2. (function (形参) {}) (实参);
// 闭包eg1.
function test(){
var arr = [];
for(var i = 0;i < 10; i++){
// arr[i] = function(){
// document.write(i + " "); //结果10个10
// 打印0-9
(function (j){
arr[j] = function(){
document.write(j + " ");
}
}(i));
}
return arr;
}
var myArr = test();
for(var k = 0;k < 10;k++){
myArr[k]();
// document.write(j + " "); //结果打印0-9
}
</script>
</body>
</html>