JS 回调函数、立即执行、for块作用域、try/catch、let、垃圾收集 p3
限于时间关系,加上有些倦意,简单的记录下一些要点:
1.回调函数:就你把函数当成参数传给另一个函数,这个函数在某个时间段会执行这个函数。😵,可以理解为这个函数参数或者说回调函数是一个过程,😵
var fn = function(f){ f(); } fn(function(){ console.log(1) });
2.立即执行函数
与$(document).ready(function(){}) 不同,立即执行就是立即执行,下面是一个题外话,引用另一位博主的话:
$(document).ready:是DOM结构绘制完毕后就执行,不必等到加载完毕。 意思就是DOM树加载完毕,就执行,不必等到页面中图片或其他外部文件都加载完毕。并且可以写多个.ready。
window.onload:是页面所有元素都加载完毕,包括图片等所有元素。只能执行一次
立即函数跟这2个货有着若有若无的关系,乱啊,例子:
// () 把函数包起来,形成一个表达式,然后加上一对()就可以立即执行了, (function(){ console.log(1) })()
例子2:
(function(a){ console.log(a) })(2)
例子3:
var a = 2; (function(){ console.log(a) })()
例子4
var a = 2; (function(window){ console.log(a) })(window);
也叫做IIFE (immediately invoke function expression)。
3.for 的快作用域
for(var i=0;i<5;i++){ console.log(i); } console.log(i) //0 //1 //2 //3 //4 // 最外层的i //5
循环中的i 像之前说的一样,创建了全局作用域。变成了5~~
原因在于当 i = 5 时,跳出了循环,所有全局作用域下i 被赋值了5,也就是说执行了6次RHS 赋值。
下次记得这样用:
var i; for( i=0;i<5;i++){ console.log(i); } // 0 1 2 3 4
4、try/catch
catch会创建一个块作用域,外部无法引用
try{ console.log(a) }catch(e){ console.log(e)// OK } console.log(e)// NO -
5.let
let会把变量绑定到所在的任意作用域,会阶段与全局作用域之间的关系,let不会提升
{ let a = 2; console.log(a); // 报错 }
拿for做个例子
for(let i=0;i<5;i++){ console.log(i); } // 0 1 2 3 4 console.log(i) //ReferenceError
另外还有一个const,是存储变量的,就不多说了,和let差不多,但是不能修改,你可以把它想成是一个final
const a = 2; a =3 // TypeError: invalid assignment to const `a'
6.垃圾收集
确定不会再用的情况
function fn(){ } // 块作用域- 执行完这个块就可以销毁了 { let s = ...; fn(s) }
下面的就不行
function fn(){ } var s = ...; fn(s) //因为还有可能会用到
~完
成灰之前,抓紧时间做点事!!