作用域

随笔          

又到了一周总结的时段了。再进入主题之前,王某人也想自己跟自己闹闹磕。    经过一段时间的学习生活,就自己一些轻身经历,的确不同于我刚来大学那段时间。比如在某些领域,慢慢的自己会主动花时间去琢磨,钻研。不在会以前那样,但凡能偷懒就偷懒。我想主要原因,还是的归结于自己内心那股渴望劲,即是人生不随便。 

说到这我想到一句话,即“做人在看待世间所有事,不要太透,太懂,久而久之会感觉到自己成了这个世界的孤儿。装点傻,还是有好处的。”,就是这样,有时候明知道那件事的结果,也会不遗余力的向前挺进。就此,我觉得吧,做人吧有时候在某些方面装成傻子还是挺好的。 

再来说说做人吧,做人难吗,想想吧不难,但也不是那么简单。有时候总有那么一两件朋友间的事情,影响到自己。重出生遁世之日起,我便投入这俗世间。投入这广阔的人际网。或说这人际网,方便了我,但也使我伤透了心,生怕一不小心就断了那个节点。自此,便开始了人际探寻之路。这一路走来,从未停止。     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 声明的的变量会提升,注意:仅提升声明,不提升赋值。

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值