今天本来在看es6,let
但是给的例子,我有些迷惑
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
以前看闭包的例子就不太懂,今天要好好研究一下!
资料说 i共享,所以就都是10
为什么????
然后追根溯源是我连js的执行顺序都没搞懂。。。
这个太不应该了
之前以为顺序嘛,就和c++ 、java一样,有什么呢?
但是!大有不同!
先说函数定义,老生常谈,有两种定义:
//“定义式”函数定义
function Fn1(){
alert("Hello World!");
}
//“赋值式”函数定义
var Fn2 = function(){
alert("Hello wild!");
}
大家都知道,但是怎么预编译的你知道吗?
页面加载过程中,浏览器会对页面上或载入的每个js代码块(或文件)进行扫描,如果遇到定义式函数,则进行预处理(类似于C等的编译),处理完成之后再开始由上至下执行;遇到赋值式函数,则只是将函数赋给一个变量,不进行预处理(类似1中变量必须先定义后引用的原则),待调用到的时候才进行处理。
我看了这几篇博客之后恍然大悟
http://www.jb51.net/article/36755.htm
http://www.jb51.net/article/44123.htm
里面说的十分详细,我就不赘述了
要注意
1.同名定义式函数定义,预编译时会覆盖!
2.赋值式函数定义是动态的,不会预处理
3.注意作用域,是一块一块的函数作用域
4.函数会提升,变量不会,所以很多都是undefined