立即执行函数与闭包

立即执行函数

//声明一个普通函数 fn
function fn(){
    console.log("hello");
}
/*然后将函数的名字去掉即是匿名函数*/
//匿名函数,直接运行时会发现报错啦!
function (){
    console.log("hello");
}

/**单独运行一个匿名函数,由于不符合语法要求,会报错
 *解决方法是可以给匿名函数包裹一个括号,匿名函数若有其它应用场景,外层括号可以省略
 */
(function (){
    //由于没有执行该匿名函数,所以不会执行匿名函数体内的语句。
    console.log("hello");
})

//在匿名函数后面加上一个括号即可立即执行
(function (){
    console.log("hello");
})()

//若需要传值,直接将参数写到括号内即可
(function (str){
    console.log("hello "+str);
})("world!")

 

匿名函数的应用场景

事件

<input type="button" value="点我!" id="btn">

<script>
    //获得按钮元素
    var sub=document.querySelector("#btn");
    //给按钮增加点击事件。
    sub.onclick=function(){
        alert("当点击按钮时会执行到我哦!");
    }
</script>

 

对象

var obj={
    name:"Java",
    age:18,
    fn:function(){
        return "Program:"+this.name+"age:"+this.age;
    }
};

//调用
console.log(obj.fn());

 

回调函数

setInterval(function(){
    console.log("这是一个回调函数,每次1秒钟会被执行一次");
},1000)

 

表达式

//将匿名函数赋值给变量fn。
var fn=function(){
    return "赋给变量的匿名函数!";
}

//变量名调用
console.log(fn());

 

下面这两段代码

例1、

$(function(){});  《==》 $(document).ready(function(){});

 

例2、

window.onload = function(){}

以上两段代码在功能上可以互换,但执行的时间不一样,前者页面框架加载完成就执行,后者页面中所有内容加载完成才执行。

 

(function(){})() 不叫闭包叫立即执行函数,所谓闭包,要拆成闭和包,闭指的是不想暴露给外部的数据,包指代将数据打包出去暴露给外部;(函数内部的变量 函数外部无法访问,这就形成了闭;函数外部想得到 函数内部的变量,可以通过某些方法譬如通过 return 语句将内部的变量暴露出去,这就形成了包;因而,立即执行函数只是函数的一种调用方式,和闭包没有必然的联系;闭包是和作用域扯上关系的;闭包的本质是执行完后只返回有用的数据,包内变量完全销毁,防止全局污染。)

闭包使用的背景,是因为常用的变量声明方式 var ,它是以函数作为作用域。就是说,如果变量是在某个函数中定义的, 那么, 它在函数以外的地方是不可见的。但是,如果该变量是定义在 if 或者 for 这样的代码块中,它在代码块外是可见的。在 js 中,术语 "全局变量" 指的是定义在所有函数之外的变量(也就是定义在全局代码中的变量),与之相对的是 "局部变量",所指的是在某个函数中定义的变量。其中,函数内的代码可以像访问自己的局部变量那样访问全局变量,反之则不行。

也是因为 var 变量是以函数作为作用域的,于是ES6增加了以代码块作为作用域的let声明;

 

匿名函数实现闭包

//1.把内部inner这个具名函数改为匿名函数并直接return
function box(){
  var a = 10;
  return function(){
    console.log(a) ; 
  }
}

var outer = box();
outer();//10

//2.把外部var outer = box()改成立即执行的匿名函数
var outer = (function(){
  var a=10;
  return function(){
    console.log(a);
  }
})();
//outer作为立即执行匿名函数执行结果的一个接收,这个执行结果是闭包,outer等于这个闭包。
//执行outer就相当于执行了匿名函数内部return的闭包函数
//这个闭包函数可以访问到匿名函数内部的私有变量a,所以打印出10
outer();//10

 

posted on 2022-03-02 14:43  zhishiyv  阅读(243)  评论(0编辑  收藏  举报

导航