2018-08-05
一,javascript 代码运行分为两个阶段:
1、预解析 --- 把所有的函数定义提前,所有的变量声明提前,变量的赋值不提前
2、执行 --- 从上到下执行 (setTimeout,setInterval,ajax中的回调函数,事件中的函数需要触发执行)
function fn(){console.log(1111);}
var abc; var fn1;
//下列两个函数,第一个会执行,第二个不会执行,就是因为javascript的预解析机制
fn();
function fn(){console.log(1111);}
fn1();
var fn1 = function(){ console.log(1111); };
var abc = '123';
二,参数函数:函数的参数可以是一个函数,这个函数可以直接调用
var obj = {
name:"zhangsan",
say:function(){console.log("hello");}
};
var cb = function(){console.log(123);}
function fn2(callback){callback();}
fn2(obj.say);
三,闭包:函数可以作为返回值,函数的嵌套形成闭包
function fn4(){
var n = 1;
var fn = function(){n ++;console.log(n);}
return fn;
}
//这里的fn5就是里面的fn,闭包的特点就是
var fn5 = fn4();
fn5(); fn5(); fn5();
//输出的结果为2,3,4,说明n的值没有被销毁,而是保留下来,另外一点:function内是一个函数空间,函数外不能够访问,闭包就可以让我们访问函数内的数据。
例子:
var i=0;var data = [];
for(i=0;i<3;i++){
data[i] = function(){console.log(i);}
}
data[0](); data[1](); data[2]();
//输出的值都是3,由于没有for里面没有块作用域,定义的i和外面的i是一样的,赋值后data里面为三个函数,i为3,故输出全为3,要想输出0,1,2,就要运用 到闭包的知识
var i=3;
var data = [];
for(i=0;i<3;i++){
data[i] = (function(k){
return function(){console.log(k);}
})(i);
}//( function(){}) ()是一个立刻执行函数,里面用到闭包,就可以存储值
data[0]();data[1]();data[2]();
网友评论