发表于: 2019-03-27 21:58:13
1 599
今天完成的事情:
1写了第二个页面的 点击事件 数字输入
2看书
明天计划的事情:
继续做任务 看书
收获:
1 f() 表示是运行了函数f() 返回的是函数f()运行后的值 ,如果是f 表示的是整个函数f()表达式 并没有运行
2闭包函数 :
function f1() {
var n = 999;
// return n; //return n之后的语句就不可以再访问变量n了 只有运行f1()可以访问(因为是f1返回的)
console.log(n)
var n = 999;
// return n; //return n之后的语句就不可以再访问变量n了 只有运行f1()可以访问(因为是f1返回的)
console.log(n)
function f2() {
console.log(n);
}
return f2; //注意 return f2是指返回一个没有运行的f2函数 即return f2()= f2(){console.log(n)}
// // 如果return f2()是指返回一个运行了的f2() 即return f2()=999
// 总结 f() 表示是运行了函数f() 返回的是函数f()运行后的值 ,如果是f 表示的是整个函数f()表达式 并没有运行
}
console.log(typeof f1)
console.log(f1()) //注意 运行函数f1() 并不会运行函数f2()
console.log(n);
}
return f2; //注意 return f2是指返回一个没有运行的f2函数 即return f2()= f2(){console.log(n)}
// // 如果return f2()是指返回一个运行了的f2() 即return f2()=999
// 总结 f() 表示是运行了函数f() 返回的是函数f()运行后的值 ,如果是f 表示的是整个函数f()表达式 并没有运行
}
console.log(typeof f1)
console.log(f1()) //注意 运行函数f1() 并不会运行函数f2()
var result = f1(); //注意 这里f1()已经运行了 并将返回值(即上面console.log(f1())打印出来的值) 赋给了 result
console.log(result)
console.log(result)
result(); // 然后运行 result() 即运行console.log(f1())打印出来的值=999,f2(){ console.log(n);} 所以结果为999(注意该999是由于运行了函数f2())
// 为什么将return f2 关闭之后 result();会报错为 result is not a function 因为关闭之后 f1()的返回值就剩下一个999了
console.log(typeof result)
// 运行f1() 与 运行result() 的区别是什么?
// 运行函数f1()的话 不可以运行函数f2();运行函数result()的话,可以运行函数f2()
// 【为什么运行result()可以运行f2()?】 因为result=f1()函数运行之后的返回值 包括一个未运行的f2()函数
// 为什么将return f2 关闭之后 result();会报错为 result is not a function 因为关闭之后 f1()的返回值就剩下一个999了
console.log(typeof result)
// 运行f1() 与 运行result() 的区别是什么?
// 运行函数f1()的话 不可以运行函数f2();运行函数result()的话,可以运行函数f2()
// 【为什么运行result()可以运行f2()?】 因为result=f1()函数运行之后的返回值 包括一个未运行的f2()函数
总结:
1)运行外部的函数时f1(),并不可以直接运行f2(),需要通过在f1函数内 return f2(即返回f2函数表达式) ,然后将f1()运行之后的结果返回给一个变量result;运行result()就可以运行f2()了
2)内部的函数可以访问外部函数的变量 ,反之不行
3)闭包的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在,不会被垃圾回收机制回收。。
4)第二段代码中,start是函数createIncrementor的内部变量。通过闭包,start的状态被保留了,每一次调用都是在上一次调用的基础上进行计算。从中可以看到,闭包inc使得函数createIncrementor的内部环境,一直存在。所以,闭包可以看作是函数内部作用域的一个接口。
为什么会这样呢?原因就在于inc始终在内存中,而inc的存在依赖于createIncrementor,因此也始终在内存中,不会在调用结束后,被垃圾回收机制回收。
5)由第三点代码可知:闭包的另一个用处,是封装对象的私有属性和私有方法。
6)注意,外层函数每次运行,都会生成一个新的闭包,而这个闭包又会保留外层函数的内部变量,所以内存消耗很大。因此不能滥用闭包,否则会造成网页的性能问题。
评论