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 - ReferenceError: e is not defined

 

5.let

let会把变量绑定到所在的任意作用域,会阶段与全局作用域之间的关系,let不会提升

{
  let a = 2;
  console.log(a);   // 报错 ReferenceError
}

拿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)

//因为还有可能会用到

 

~完

 

posted @ 2019-01-28 21:04  李鹏飞ONLINE  阅读(829)  评论(0编辑  收藏  举报