1. 闭包
1 闭包的作用:
延长变量的生命周期;
提供一种间接访问函数封闭空间内部数据的方法。
保护数据让代码更安全和稳定。
2 setTimeOut和闭包:
js本身是单线程。
单线程的局限性:执行多个任务时,只能串行的执行任务。
js的主要任务(优先顺序):
(1)渲染任务
(2)脚本中的主要代码
(3)事件处理任务(定时器事件|点击事件等等)
因此在for循环中,setTimeout获取不到i的值。
补充:
并发和并行的区别:
并发:多条线程同时执行任务的现象;
并行:同时执行多个任务的能力。
2. 函数
函数本质上是一个对象,因此凡是可以使用对象的地方都可以使用函数。函数可以作为其他函数的参数或返回值。
函数可以创建作用域;也可以有自己的属性和方法。
1 函数的创建:
函数声明 function 函数名(参数){函数体}
表达式
var func = function(){}; //匿名的函数表达式
var func = function name(){}; //命名的函数表达式
构造函数 var func = new Function();
函数.name:获取函数的名称
eg: var func01 = function(){};
var func02 = function funcName(){};
console.log(func01.name); //火狐中 空
console.log(func02.name); //funcName
2 函数的回调:函数可以作为参数或者返回值。
注意:函数作为参数进行回调时,this指针问题
如果回调函数是某个对象的方法,而该对象方法中使用了this指针,那么该方法作为回调函数来使用的时候,this指针会改变。、
通过在函数内部对传入的参数做修正this的处理即可。
eg: var name = "测试名称";
function demo(callBack){ //callBack是一个函数
//callBack(); //callBack()调用 this->window show 测试名称
//要想还让this指向对象,需要call|apply
callBack.call(obj);
}
var obj = {
name:"张三",
show:function(){
console.log("show" + this.name);
}
}
demo(obj.show); //通过callBack.call(obj);将this指向obj, show 张三
3.惰性函数(自定义函数)
【通过函数直接调用】在第二次调用函数的时候,这个函数才被真正的定义。第一次调用,知识做一些初始化的操作;
惰性函数缺点:
(1)实现自我更新之后,会把之前函数上面的属性丢失;
(2)把函数赋值给变量或者对象的方法之后,以变量或者对方法来调用,就不会自我更新
eg:
function foo(){
//初始化操作
console.log("foo");
foo = function(){
console.log("foo foo");
}
}
foo.des = "foo的描述信息";
// console.log(foo.des);
// foo(); //foo //函数直接调用
// foo(); //foo foo
// foo(); //foo foo
// console.log(foo.des); //undefined
var demo = foo; //如果通过赋值给别的函数调用,就不会出现覆盖问题
demo(); //foo
demo(); //foo
demo(); //foo
console.log(demo.des); //foo的描述信息
4.即时对象初始化
写法:
(1)提供一个对象{}
(2)在对象中提供一个初始化方法,用作初始化操作
(3)在对象外部添加(),包装成一个表达式
(4)直接使用.init()来进行初始化处理
eg: