目录
前记:前路漫漫,什么可以为源泉?
(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数组对象中的变量处于同一层级。
运行时查找作用域的值,在同一层级的作用域往外找,找到对应的值,停止。因此内层作用域的值可以取外层作用域的值,外层作用域的值无法取到内层作用域的值。
运行结束,未被调用得值会被释放。而函数一直处于运行状态中,对应的运行环境也就是变量作用域的值就不会被销毁。这是闭包能够另值存在不被销毁的原因。