第三周JavaScript学习记录

学习笔记 专栏收录该内容
2 篇文章 0 订阅

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

第三周学习内容

作用域

  • 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);//10
console.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
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

三土啊

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值