随笔
又到了一周总结的时段了。再进入主题之前,王某人也想自己跟自己闹闹磕。 经过一段时间的学习生活,就自己一些轻身经历,的确不同于我刚来大学那段时间。比如在某些领域,慢慢的自己会主动花时间去琢磨,钻研。不在会以前那样,但凡能偷懒就偷懒。我想主要原因,还是的归结于自己内心那股渴望劲,即是人生不随便。
说到这我想到一句话,即“做人在看待世间所有事,不要太透,太懂,久而久之会感觉到自己成了这个世界的孤儿。装点傻,还是有好处的。”,就是这样,有时候明知道那件事的结果,也会不遗余力的向前挺进。就此,我觉得吧,做人吧有时候在某些方面装成傻子还是挺好的。
再来说说做人吧,做人难吗,想想吧不难,但也不是那么简单。有时候总有那么一两件朋友间的事情,影响到自己。重出生遁世之日起,我便投入这俗世间。投入这广阔的人际网。或说这人际网,方便了我,但也使我伤透了心,生怕一不小心就断了那个节点。自此,便开始了人际探寻之路。这一路走来,从未停止。 17年我来到了大学,曾经那段探寻之路,可算是结束了。我要以我这么多年苦痛经历下,总结的经验。好好度过这一生 。总之,做人吧。不管这世间怎么变,做自己就好。累了就休息,伤心时,就放声大哭场。有话就说,没话就当个哑巴,专心投入到自己所忙的事。轻轻松松,不多想,不做作 。一切甚好。
js-作用域
说起作用域,这绝对不是陌生的词。对,所有编程语言的常客,经常都会碰到。但是今天分享的作用,不同高级语言作用域,但大同小异,js的作用域。js作用域,的确我想说挺坑的,令人费解。因为这个语言的作用域,不想其他语言那么严谨。使用尤其要住意入坑。下面见详解及案列:
再将作用之前,先来说说js的工作原理:
声明变量:var a = 2;
合理假设编译器会做如下处理:为变量分配内存,指针,并将其命名为a,然后将其赋值为2。然而,这样,并不完全正确。
事实上编译器会做如下处理:首先会在当前作用域查找是否又相同变量名,如果是,编译器会忽略该申明。否则,编译器会在当前 作用域集合中,声明该变量,为a。 然后是赋值操作,编译器会生成相应代码,供引擎使用。当然引擎并不会直接进行赋值,它会在当前作用域中,进行L and R查询,查找变量名及值。然后在进行赋值操作。同样函数,也会有如下赋值操作过程,js中函数也是变量。下面就
L and R查询举例讲解:
1.R查询
console.log(a), a没有声明赋值。相应他会查询变量取得a的值,然后赋值给 console.log 打印。
2.L查询
a = 2;
很显然,当前我们并不关心值是什么,我们需要赋值容器。即需要a,并将2,赋值给他。
刚开是接触这两个查询方式概念,的确把我弄糊涂了。尤其是后面它例举的案列,我更是一头雾水。最后查资料加冥思,可算是ok.
总之:凡是,设计赋值操作都会是,就是L查询。反之,就是R查询。(注意有些隐式查询)
下面引入一段引擎于作用域有趣对话。方便理解概念:
作用域--作用域嵌套
作用域:即是引擎查询变量的时一个打杂的。实际情况中,变量查询时同时,会顾及几个作用域。不多逼逼,直接上图
作用域--词法作用域
词法作用域:分为两种工作模式。分词法和动态两种。词法作用域诞生,即是由自己所写代码块决定。
- 词法--查找
funtion foo(a){
var b = a * 2;
function bar(c){
console.log(a,b,c);
}
bar(b*3);
}
foo(2)//2,4,12;
这里就a查找顺序分析,提到一点:从内向外开始,找到第一个匹配标识符(变量和函数名),停止查询。首先,对console.log声明查询,就a进行R查询,引擎会在bar函数查询。当前作用域没有a,往上一级继续查询。找到foo函数内a.
函数作用域 and 块级作用域
函数作用域
- 隐藏内部:规避冲突(全局命名空间,模块管理)
- 函数内容隐藏,作为函数整体实现功能的代码,可以放在函数内部。避免污染。
- 函数作用域(主要谈:IIFE)
IIFE:避免函数污染作用域,其次函数可以不用引用,自己运行。因整个函数表达式被定义在,()内,不被外部作用域访问调用。
进阶运用IIFE;
传入外部域的变量
//IIEF模式,场景1
var a = 2;
(function IIFE(global){
//这里使用了两个a值
var a = 3;
console.log( a );//3
console.log(global.a );//2
})(window);
console.log(a);//2
//场景2
块级作用域:顾名思义就是代码块,就是{};好处:代码仅仅代码块内使用,不被外部引用。所以尽量本地化变量。
- let, var ,const
let:创建块级作用域,且不能在重复该let的变量。可以修改。let不会提升,故必须先定义在使用。
const:声明常量,不修改。创建块级作用域。
var 创建变量,会绑定到所在作用域。不会创建块级作用域。
并且var 声明的的变量会提升,注意:仅提升声明,不提升赋值。