JS相关总结1.0

JS相关知识总结

已经初步学过JS,个人总结一下所学相关难点和重点,对大概知识进行一个梳理,想深入了解的朋友可以去W3C中了解Javascript

JS简介

JS是一款轻量级的脚本语言,目前被广泛应用于Web中,名字看起来和Java很像,实际上并无太大关系。JS最初是其作者Brendan Eich为了应付公司任务,10天写出来的语言,因为时间仓促,语言的一些细节不是很严谨,所以其自由的风格使得入门简单,但深入比较复杂

相关重点

作用域

作用域是访问变量的集合。
在JS中, 对象和函数同样也是变量,作用域为可访问变量,对象,函数的集合。
JS的作用域分两种:全局作用域和局部作用域

全局作用域

变量在函数外定义,即为全局变量,全局变量有全局作用域: 网页中所有脚本和函数均可使用
注意: JS由于时间仓促,并不严谨,if语句,for循环等语句并没有自己的块级作用域,因此其中定义的变量依然为全局变量

<script>
let a = 123;
//全局变量a
demo1();
function demo1() 
{
    alert(a);
    //函数内部可访问全局变量a,内部作用域可访问访问外部作用域
}
</script>

<script>
demo2();
alert(a);
//外部作用域可以调用a,因为a为全局变量
function demo2() 
{
    a = 123;
    //变量a在函数内部没有声明(没有使用var关键字),为全局变量
}
</script>
局部作用域

变量在函数内部声明,变量为局部变量,局部变量有局部作用域:只能在函数内部访问

<script>
demo()
console.log(a);
//a在外部并没有定义,外部作用域无法调用内部作用域的变量a
//网页报错:a is not defined,即找不到a
function demo()
{
    var a = 123;//a为局部变量,只能在函数内部调用外界无法访问
    console.log(a);
}
</script>

JS的变量提升

JS是按照上下文的顺序对代码进行执行的,简称EC,每一个作用域都有自己的EC顺序,自己的作用域会按照这个顺序对函数进行编译
但是有些变量会在编译全文前进行提升,这样他们会在代码执行前就已经被提升到最顶部进行声明
1.全局作用域会在执行前,声明带var的变量,function定义的函数

<script>
console.log(a);
//JS对变量a进行了提升,所以该输出不会显示报错:a is not defind
//虽然对变量a进行了提升,但并不是执行变量a所在的那一行,因此a并没有被赋值,网页会输出a的值为undefined
var a = 123;
//对a进行赋值
console.log(a)
//此时a已被赋值过,所以网页输出a的值为123
</script>

<script>
f();
//函数f虽然在最后被定义的,但JS会对函数f进行提升,提升到最顶部,因此f()语句可以调用函数f
function f()
{
    console.log(a);
}
</script>

2.局部作用域同上,对对自己里面带var的变量。和自己作用域里定义的函数进行提升

JS的闭包

由上面的介绍可知,外部作用域无法访问内部作用域里的变量数据,不同函数的局部作用域之间也无法相互访问。因此这就有了一个问题:如果我们想在外部访问到内部作用域里的变量数据,在一个函数内部访问到另一个函数内的变量,怎么办?
闭包就是解决这一问题的,函数在被执行时会产生一个堆,函数执行完堆被销毁,因此外部找不到内部的变量,但闭包可以让此堆不被销毁,在离开网页前,一直存在于内存中,外部可以通过闭包找到这个堆,对里面的变量进行访问。

<script>
var i = 5;
function fn(i)
{
    return function(n)
    {
        console.log(n+(++i));
    }
}
var f = fn(1);
//函数被fn()返回的是另一个函数,这个函数作用在fn()作用域内部,将这个函数作为返回的变量赋值给全局变量f,此时在全局中访问到了局部作用域内部。
//这时,这个堆不会被释放,可以在全局中被继续引用
f(2);
fn(3)(4);
//此时,是直接调用函数,相当于又新建了一个堆,此堆与之前无关,重现执行EC(fn(i))
fn(5)(6);
f(7);
//闭包形成的堆未被释放,此堆接着闭包形成的堆的结果继续执行
console.log(i);
//JS会优先在自己的作用域内找变量,在EC(G)找到全局变量i = 5,所以不受前面闭包和函数调用的影响,此语句输出为全局变量中i的值,即输出5
</script> 

最后总结一下闭包的好处和坏处
好处:延长一个局部变量的生命周期,可以使不同作用域之间互相访问
坏处:闭包会造成所引用的函数里的变量常驻内存,增大了内存消耗,引起内存泄漏
对应解决方法:可以在使用完变量后,手动赋值为null

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值