红皮书函数

  1. 定义函数
    定义函数方式:函数声明,函数表达式
    函数声明:有函数声明提升,可把函数声明放在调用它的语句后面
    函数表达式:创建一个函数并将它赋值给一个变量,这种情况下创建的函数叫做匿名函数,该函数表达式在使用前必须先赋值

    匿名函数与普通函数的区别:
    在这里插入图片描述

  2. 闭包
    有权访问另一个函数作用域中的变量的函数,常见创建方式,就是在一个函数内部创建另一个函数

    内部函数的作用域链中包含外部函数的作用域,当函数被调用时,会创建一个执行环境及相应的作用域链。

    每个执行环境都有一个表示变量的对象:变量对象,局部环境的变量对象,只在函数执行的过程中存在。

    1. 在创建函数时:会创建一个预先包含外部环境的变量对象的作用域链,该 作用域链被保存在内部的[[Scope]]属性中,作用域链本质上是一个指向变量对象的指针列表,它只引用但不实际包含变量对象。

    2. 调用函数时:会为函数创建一个执行环境,然后复制函数的[[Scope]]属性中的对象构建起执行环境的作用域链,创建该函数的活动对象并推入执行环境作用域链的前端,则其作用域链中包含的变量对象:本地活动对象和复制而来的活动对象

  3. 作用域链
    如下有一个全局环境下的函数

    function compare(value1, value2) {
         if (value1 < value2){
    	 	return -1;
    	} else if (value1 > value2){
    	 	return 1;
    	} else {
    	 	return 0;
    	} 
    }
    var result = compare(5, 10);
    

    其作用域链如图所示:
    在这里插入图片描述
    闭包函数的作用域链原理相同

    function fun1(name) {
      return function () {
        console.log(name)
      }
    }
    var re = fun1('wang')
    re()
    //解除对匿名函数的引用(以便释放内存)
    re = null
    

    fun1执行完毕以后,其作用域链被销毁,但是其内部匿名函数的作用域链还引用着fun1的活动对象,所以fun1的活动对象不会被销毁,匿名函数被销毁后,fun1活动对象才会被销毁

  4. 匿名函数的执行环境具有全局性,其 this 对象通常指向 window;

    var obj={
        sayName(){
          console.log(this)	//指向obj
          return function(){
            console.log(this)	//指向window
          }
        }
      }
      obj.sayName()()
      //{sayName: ƒ}
      //Window 
    

    obj.sayName()()的执行顺序等同于

    var a=obj.sayName()	//把匿名函数赋值给变量a
    a()	//执行该函数,则该函数中的this指向全局window
    

    这样就很容易看出sayName()方法中的匿名函数的this指向window

  5. 闭包的变量问题

    function createFunctions(){
        var result = new Array();
        for (var i=0; i < 10; i++){
          result[i] = function(){
            return i;
          };
        }
        return result;
      } 
      createFunctions()	//[ƒ, ƒ, ƒ, ƒ, ƒ, ƒ, ƒ, ƒ, ƒ, ƒ]
      createFunctions()[1]()	//10
      createFunctions()[3]()	//10
    

    看似每个函数都应该返自己的索引值,但实际上,每个函数都返回 10
    因为每个函数的作用域链中都保存着 createFunctions() 函数的活动对象(是指针指向不是副本),即每个函数都引用同一个变量 i 。 当执行了createFunctions()后,变量 i 的值已经是 10,此时每个函数都指向该变量 i ,所以在每个函数内部 i 的值都是 10。(关键理解作用域链只引用不实际包含活动对象)

    解决1:立即执行函数

     function createFunctions(){
         var result = new Array();
         for (var i=0; i < 10; i++){
           result[i] = function(num){
             return function(){
               return num;
             };
           }(i);
         }
         return result;
       } 
    

    每次执行 立即执行函数时,都把i值以num副本的形式保存在相应的函数中
    解决2:let

    	function createFunctions(){
         var result = new Array();
         for (let i =0; i < 10; i++){
           result[i] = function(){
               return i;
           }
         }
         return result;
       } 
    
  6. 利用闭包创建私有作用域

    (function(){
       var date=new date()
     })()
    

    在该函数中定义的任何变量,都会在函数立即执行结束时被销毁,这样限制向全局作用域中添加过多的变量和函数,来减少命名冲突

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值