深入理解Javascript到相关知识体系的整理构建(二)

本文探讨了JavaScript中的function类型对象,包括其三种创建方式、执行原理以及作用域链和闭包的概念。强调了函数作为数据容器和操作的重要性,并指出快速识别和整合信息的能力在编程中的核心地位。通过实例解析了函数声明与表达式创建的区别,以及闭包如何保持变量状态。同时,详细阐述了函数执行时的作用域链和argument对象的工作机制。
摘要由CSDN通过智能技术生成

目录

前记:前路漫漫,什么可以为源泉?

(1)力量有很多种,心平气和的那种最为坚定

(2)快与慢-感受思考的状态

(3)殊途同归

四、function类型对象

4.1 总览function类型对象

4.2 三种function类型对象的创建方式

4.2.1 function两种创建得方式

4.3 处理业务-JS函数的执行方式

4.3.1 函数是什么 、匿名函数和闭包    

4.3.2 函数的运行环境中的作用域链和argument


 

前记:前路漫漫,什么可以为源泉?

(1)力量有很多种,心平气和的那种最为坚定

     时间就像走一条深远的路,深一脚浅一脚的走来。穿过沙漠,雪地,草地,山川,沿途的景物令人感觉应接不暇。有的令人神往,应接不暇。驱使前进的力量,有各种各样。有少年的一腔孤勇“学不成才誓不还”,有对权势的追寻“衣锦还乡,出人头地”,有匡扶天下为己任的壮志雄心"成为时代的弄潮儿",又或者是平淡开心的度过一生"小桥流水人家"...,这些力量为心而论没有优劣之分,都是有趣的力量。热血澎湃的最为刚猛,兼济天下的最为敬佩,权势和所拥有的事情所赋予的力量最易失去,而心平气和的那种最为坚定。

(2)快与慢-感受思考的状态

      跑跑跑、冲冲冲、走走走,快和慢也很像行路,感知自己的状态,把握节奏。若能在感知自身节奏下,清晰的思考。对自己来说,最快的速度应该是思考的速度,而思考的速度,和状态关联很大。感知自己的思维状态,适当切换和休整。比沉迷在思考的怪圈,未能理清脉络脉络,要快很多。

      理论上思考可以更快更全,但是往往容易因为急于操作和行动,会需要走很多遍类似的思绪。


(3)殊途同归

      将信息规整,识别,总结分析,成像到结论。这像是工作的状态,又像是学习和搭建知识结构的状态,但是再一想,似乎这囊括了大半的我们所需要学习和处理事的逻辑。按照这个逻辑,形成相应的高效的方式对信息、资源整合和调度的角度来讲,不管是什么行业,路径和目的是一致的。只是需要整合的信息和资源不一样,导致形成的结构和状态习惯的侧重点和特点不一样。

      核心是信息的整合、识别,成像,组合和创造 。感受这个过程,以及磨合和优化适合自己的方法论和思维路径,这将会是无人可以剥夺的强大和能力。如果有天一无所有,所能拥有的就是我们的思考和判断整理和分析数据的能力和视角,能够开创新纪元的保证。

       网络时代,存储和记忆能力被计算机无限扩大。所以理论上来说,从记忆得容量和牢固程度来看,我们远远不及机器。我们所具有得核心价值,是快速识别信息,整合信息得能力。这种能力是无法被取代的。这也是我所要寻找的核心能力的,如何加强这样的能力?

      结构梳理使用总分总的结构进行:(参考--《你不知道的Javascript》<<Javascript设计模式与开发和实践>>《深入理解Javascript》

四、function类型对象

4.1 总览function类型对象

        function类对象有三个子类型,分别有着各自的作用。从功能划分,引申出下面的分支

         编程语言中最重要的两个部分,数据容器和数据的操作。function类对象都占全了。既可以作为对象,存储数据,又可以作为数据的操作处理业务。

4.2 三种function类型对象的创建方式

/*作为对象*/
function people(){}
people.val="你好";
people.age=3
people.showname=function(){
    console.log(this.val);
    console.log(this.age);
}
people.showname();//你好 3
/*业务处理*/
function doit(age){
    console.log(age);
}
doit(3);//3
/*创建对象*/
function changePerson(){
 var people={};
  people.name="小花";
  people.age="8"
  return people;
}
console.log(changePerson());//{name:"小花",age:"8"}

  这三种用法,多半写程序都用过。用的时候完全没察觉到其中的差别。但是实际上从原型链和衍生的使用上有很大的差别。这三种function子类型对象,构成了大部分的Javascript高阶函数的底层实现。

4.2.1 function两种创建得方式

    从宏观角度来看,在JS中的所有数据可以看作两种存在形式。一种是对象的属性,还一种是变量。函数同样也是名字、值对的结构。得出这样结论核心原因就是因为js的内存机制。先划分内存,然后找到对应的内存空间。而命名的核心作用就是找到对应的内存地址

/*function的两种创建方式*/
/*函数声明创建*/
    function log(showError){
    console.log(showError)
    }
/*函数表达式创建*/
    var log=function(showError){
    console.log(showError)
}

  从内存模型的角度分析两种创建方式的不同和差异

(1)函数式声明创建函数时,JS创建了函数对象,然后创建了和函数名同名的变量。然后将创建出来的函数对象赋值给了这个变量。过程等同于: var log=function log(){}

(2)函数表达式的创建,则是先创建一个匿名函数,然后再赋值给对应定义的变量

      从内存模型的角度来看函数,发现函数和变量关系很密切。是在Js中数据存在的两大形式。其中没有魔法般的神秘,有的只是创造者的逻辑和切实的实现方式。

4.3 处理业务-JS函数的执行方式

     函数延申的大致结构梳理如下

4.3.1 函数是什么 、匿名函数和闭包    

函数是什么?函数也并不是什么稀奇的东西,在JS中函数同样也是一种对象,底层通过一块内存保存起来,在调用的时候只需要找到这块内存,然后创建好执行环境,就可以执行。因此核心是两点,找到内存和创造环境。

/*自运行匿名函数*/
var log=(function(){
    console.log("调用方法");
    return function(param){
    console.log(param);
    }
})()
log("nihao");

   匿名函数中,用小括号将匿名函数括起来,后面再加上一个表示执行的小括号(这是js的语法规则,表示立即执行)。此函数包含两个保存函数的内存,匿名函数的内存和return的函数的内存。return的是函数内存地址,因此任然可以使用log调用此函数。函数就是一块内存地址,找到它,然后就可以执行它。

/*js中最简单的闭包*/
function test(){
    var get=3;
    function f2(){
        var fget=5;
       console.log(get++);
       console.log(fget++);
    }
   return f2;
}
var f=test();
f();//3   5
f();//4   5
f();//5   5

  在test中定义的变量get,在function外面是不可以访问的。但是从函数的核心出发,只需要找到对应的函数的内存,我们就可以使用它。那么可以通过获取内部的函数地址,在外面调用内部的函数,就可以使用内部的变量了。这就是闭包。因为js中的垃圾回收机制,在function f2的引用失效前,对应的内存和上下文作用域的值会一直保存不会被回收。  每次创建新的f2函数时候,对应的环境都会重新创建,但是由于作用域链的原因,为了让f2正确执行,f2所需要的f1中的环境变量,不会被释放。

4.3.2 函数的运行环境中的作用域链和argument

     函数的就是一块内存,在每次执行的时候,创建一个参数数组和一个变量数组。调用时所传递的参数设置到参数数组中,在JS中会自动创建一个argument对象,然后将所有参数的地址保存在里面。java函数中常用的形参,在js中的实际操作中会翻译成argument中对应位置的参数。因此在调用的时候可以不传参数,或者是传任意参数。因此在js中没有重载的概念,传递的参数个数不会影响最后的结果。

     将函数执行的过程分为三个状态,运行前,开始运行,到运行结束。  运行前引擎会根据各个函数定义的变量形成一个作用域链。然后将各个变量中的变量从外到内依次存放到作用域链中 结构图衍生到如下:

   

/*模拟函数作用域的创建*/
var m=8;
function a(){
 var m=7;
 console.log(m);
}
a();
/*
1.a函数执行前,作用域链中依次由外到内存放对应的变量[全局对象,外层的m变量对象,function函数对象,func中的变量a]
2.最后取变量得时候,是从外层往内取的。
*/

     开始运行时,arguments对象数组作为参数数组,和function数组对象中的变量处于同一层级。

     运行时查找作用域的值,在同一层级的作用域往外找,找到对应的值,停止。因此内层作用域的值可以取外层作用域的值,外层作用域的值无法取到内层作用域的值。

     运行结束,未被调用得值会被释放。而函数一直处于运行状态中,对应的运行环境也就是变量作用域的值就不会被销毁。这是闭包能够另值存在不被销毁的原因。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值