观看渡一教学视频做的笔记,加强基础知识。
1. 闭包
当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄露。
function a () {
function b () {
}
return b;
}
var demo = a();
demo();
var demo;
function b() {
var abc = 100;
function a (){
console.log(abc)
}
demo = a;
}
b();
demo(); //100
//只要把内部的函数拿到外面执行,就是闭包(里面的函数比外面的函数执行的寿命还长)
当a被定义的时候,生成一个a的GO;
当a被执行的时候,生成一个a的AO 和 a的GO;
当b被定义的时候,还是指向a的AO 和 a的GO;(a被执行后,本应该销毁a的作用域链,但是因为b在用,所以a的作用域链没被销毁)
直到b被执行后,a被销毁;
闭包的作用
1.实现公有变量:eg:函数累加器
function test() {
var number = 100;
function a() {
number++
}
function b() {
number--;
}
return [a,b];
}
var myArr = test();
myArr[0](); //101
myArr[1](); //100
2.可以做缓存(存储结构)eg:eater
function eater () {
var food = '';
var obj = {
eat: function () {
food = ''
},
push: function (myFood) {
food = myFood;
}
}
return obj;
}
var eater1 = eater();
eater1.push('apple');
eater1.eat();
3.可是实现封装,属性私有化 eg:Person()
4.模块化开发,防止污染全局变量
function test() {
var arr = [];
for (var i = 0;i < 10; i++) {
arr[i] = function () {
document.write(i);
}
}
return arr;
}
var myArr = test();
for (var j = 0; j < 10; j++){
myArr[j]();
}
//结果为10个10
function test() {
var arr = [];
for (var i = 0;i < 10; i++) {
(function (j){
arr[j] = function () {
document.write(j);
}
}(i))
}
return arr;
}
var myArr = test();
for (var j = 0; j < 10; j++){
myArr[j]();
}
//结果为0-9
2. 立即执行函数
针对初始化功能的函数,执行之后就被销毁(只执行一次)
(function abc() {
var a = 123,
b = 234;
console.log(a+b);
}())
abc() //报错,执行一次后就被销毁了,所以报错
var num = (function (a,b,c) {
var d = a + b + c;
return d;
}(1,2,3))
两种写法:
(function () {} ())或 (function (){})()
function test () {} //这叫函数声明,只有表达式才能被执行符号执行
var test = function () {
console.log(‘111’)
}(); //这样能被执行,这是函数表达式,执行后,(表达式的名字就没有用了test)
- function test() {
console.log('111');
}() //加个负号,变成表达式了,可以立即执行,但是test就不代表一个函数了
function test (a,b,c) {
console.log(a,b,c)
}(1,2,4)
//这样肯定不会执行,但是也不会报错。系统理解为下面这样
function test (a,b,c) {
console.log(a,b,c)
}
(1,2,4)
//函数为函数,括号为括号表达式
var a = (1-1,1+1);
a的结果为2 // 逗号表达式是先看前面的表达式,能算就算出结果;然后看后面的表达式,最后返回的结果是后面表达式算出的结果;
var f = (
function f() {
console.log('1')
},
function m() {
console.log(2)
}
)(); //结果为number,先执行()里面的,然后再执行
var x = 1;
if (function f() {}) {
x += typeof f;
}
console.log(x) //结果为1undefined,类型为字符串