第三周JavaScript学习记录

来源:互联网 发布:轩辕剑 还原数据库 编辑:程序博客网 时间:2024/06/06 01:01

本文内容属学习记录及笔记,如有错误请多多指教。

第三周学习内容

作用域

  • LHS与RHS查询

引用自前辈们的Blog

LHS(Left-hand Side):left是指“=”号的左边,意思是要给查询得到的这个变量赋值,比如要吧1付给a变量,要先查询a是否存在,这时候用的就是LHS查询

RHS(Right-hand Side):right指的是“=”号右边,意思是要获取某个变量的值,比如打印a变量,console.log(a);js引擎要去查询这个变量是否存在,得到变量只想的值,这个时候用的就是RHS查询

LHS查询比较松散,如果查询不到,就会创建一个全局的,不会抛出异常

RHS查询比较严格,如果查询不到的话就会抛出异常,因为你要获取某个变量指向的值,可是根本就没有那个变量,这个时候已经超出它的能力范围,所以只能抛出异常

function foo(){    a=b;}foo();//这里就会提示错误,因为B并未fu值,而又进行了RHS查询

还有一个比较形象的解释,来自前辈们的Blog

var c =3;  function a(b){      console.log(b+c);  }  a(2);  

对于上面的代码,引擎与作用域是这样交流的:
引擎:全局作用域,我想找一下c,你见过他么?
全局作用域:嗨,别提了,编译器那小子刚刚声明了它,拿去吧!
引擎:太棒了!我现在要把3丢给他
引擎:等一下,还有一个事情想麻烦你一下,我想对a函数进行引用,你知道她在哪里么?
全局作用域:就是那个跟c一起被丢进来的家伙把?喏,在这里呢,给你。
引擎:哈哈,太感谢了,这样我只需要把2…..。
a函数作用域:萨瓦迪卡,引擎,今天天气不错啊,一起出去玩吧!
引擎:别提了,我手头上忙的要死,对了,你碰到过一个叫b的么?
a函数作用域:哦,他是a函数的一个形参,我这刚好有,拿去用
引擎:够哥们,这样我只需要把2放到b里面,之后…..哎,小a,console你有么
a函数作用域:有有有,这是个内置对象,给你
引擎:哈哈,你一直这么靠谱,我找找,哎呦,真有log这个函数,我得赶紧引用他
引擎:你看我这脑子,你能在帮我找一下b么,我得确认一下b的内容
a函数作用域:放心,看!b没有变过,放心
引擎:那最好了,就差最后一步了,做完喝酒去,你那里有没有c,交出来我请你一包辣条!
a函数作用域:真的么!我找找,嗯…..不行,我这里没有,你得去问问我大哥 全局作用域
引擎:全局作用域,不好意思,又来找你了,不知道你有没有c,我拿辣条跟你换
全局作用域:看你累的满头大汗的,辣条你自己留着吧,c给你,做完快歇歇吧
引擎:么么哒,你最好了,晚上我请你吃饭!

  • 2.声明提升
a=2;var a;console.log(a);//2

直觉上来看,可能会认为在声明了a=2之后var a 会被重新赋值了,但是实际上输出的还是2。

console.log(a);var a=2;//undefined

而这里却是undefined,其实原因是变量会声明提升。

//上面函数等同于var a;console.log(a);a=2;//undefined

函数声明一样也会进行声明提升

foo();function foo(){    console.log(1);}

之所以这串代码会输出1,因为函数声明会提升。

//上面的函数声明等同于function foo(){    console.log(1);}foo()

但是要注意的是,函数声明会进行提升,函数表达式却不会进行提升

foo();var foo= function(){    console.log(1);//输出错误}

未完成函数声明与函数表达式的的异同分辨

  • 函数作用域和全局作用域
var a=b=10;(funcition(){    var a=b=20;})();console.log(a);//10console.log(b);//20

这个例子就很好的说明的,函数作用域内的变量只能内部访问,而全局作用域的变量可以 在任何地方访问。而JS是么有块级作用域的,前辈们的Blog里有很多例子可以思考。
未完待续


记录一些代码

if(!'a' in window){    var a=1;}console.log(a);//undefined

解析这个代码

if(!'a' in window) //是逻辑非,值的类型是布伦值-布伦值,所以!a=false,所以可以理解为 if(false in window)var a=1;//if判断不成立,a并未赋值console.log(a);//undefined

可以使用为window对象添加false属性的方法来让IF成立

var window={};window.false="yes";if(!'a' in window){    var a=1;}console.log(a);//1
原创粉丝点击