var x = 10;
function fn() {
console.log(x);
}
function show(f) {
var x = 20
f()
}
show(fn)
var fn1 = function() {
console.log(fn1);
}
fn1()
var obj = {
fn2: function() {
console.log(this.fn2);
}
}
obj.fn2()
作用域:
- 块没有作用域(大括号没有作用域);
- 隔离变量:不同作用域可以声明相同的变量名,不会受到影响;
- 作用域:的个数(n+1:你表示定义的函数个数),作用域在函数定义的时候就确定了,是静态的,函数定义后就一直存在,不会再变化;
- 执行上下文:全局:在全局作用域确定之后,js代码马上执行之前创建;函数:在函数调用之前,函数体执行之前;是动态的,调用函数时创建,调用结束后自动释放掉;
- 联系:上下文环境(对象)属于所在的作用域;
- 作用域链:嵌套的作用域,从里到外变量;
// 将函数作为一个函数的返回值
function fn1() {
var a = 10
function fn2() {
a++
console.log(a);
}
return fn2
}
var f = fn1()
console.log(f);
f()
f()
// 将函数作为实参,传递给另一个函数调用
function showDelay(msg, time) {
setTimeout(function() {
console.log(msg);
}, time)
}
showDelay('zhangsan',10)
// 闭包的缺点
function fn3() {
var arr = new Array(100)
function fn4() {
console.log(arr.length);
}
return fn4
}
var fnn = fn3()
fnn()
fnn = null
console.log(fnn);
闭包:
- 闭包的产生:当一个嵌套的内部函数引用了外部嵌套函数的变量(函数)时,就产生了闭包;执行函数定义就会产生闭包(不用调用内部函数,但是外部函数需要调用);在外部函数定义变量,在内部函数引用变量,才会产生;
- 闭包是什么:将一个内部函数和外部函数连接起来的桥梁;
- 闭包作用:使函数内部的变量在函数执行完成后,任然存在内存中(延长局部变量的生命周期);让函数外部可以操作(读写)到函数内部的数据(变量、函数);
- 闭包的生命周期:产生:在嵌套内部函数定义执行完成就产生;死亡:在嵌套的内部函数没有被调用(指向)称为垃圾对象时;
- js模块:具有特定功能的js文件、所有的数据和功能都封装在一个函数里面(私有的)、只向外暴露一个包含多个方法的对象或函数、模块的使用者,只需要通过模块暴露的对象调用方法来实现对应功能;
- 闭包的缺点:函数执行完之后,函数内部局部变量没有释放,占用内存时间变长,容易造成内存泄漏;解决:让内部函数称为垃圾对象,回收闭包;内存溢出(程序运行的一种错误,程序运行需要的内存超过了剩余的内存,就会抛出内存溢出的错误);内存泄漏(占用内存没有及时释放,内存泄漏积累多了很容易导致内存溢出;常见的内存泄漏:1.意外全局变量,如局部没有用var定义,导致变为全局变量;2.启动循环定时器后或回调函数不清理,不用的时候需要清理;);