JavaScript之闭包引入

本文介绍了JavaScript中的关键概念,如变量的使用与默认值、函数执行与返回值、变量提升、全局变量与污染、以及闭包的工作原理,通过实例解析了作用域链在不同情况下的行为。
摘要由CSDN通过智能技术生成

 1.使用一个变量就是在使用它的值

var a = 10;
console.log(a);

2.使用一个执行的函数就是在使用它的返回值

function fn() {
    return 10
}
console.log(fn())

3.参数的默认值

function fn(a=10) {
    console.log(a)
}
fn()//10
fn(20)//20

4.变量提升

var a;//在进入一个新的作用域时,显示声明的变量会被提升到作用内
a = 10;//给变量的声明的本质是使用变量,给不存在的变量赋值会在全局生成临时变量

5.全局污染

var obj = {
    a: 10,
    b: 100,
    8: 100
}
//访问obj的属性a
console.log(obj.a)
//.语法访问 .后面的值会被解析成属性名
console.log(obj['a'])//10
console.log(obj[8])//100
//[]语法访问
//优先按照值的特性解析成对应的数据类型
//'a'被解析成字符串a 8被解析成数字8
//如果中括号内的值没有明显的数据类型的特点,就会被解析成变量
console.log(obj[a])//报错 变量a不存在
//当访问的属性名被保存在变量中时,则必须中括号语法
for(i in obj){
    cnsole.log(i)//变量i代表属性名
    cnsole.log(obj[i])//打印属性值
}

6.闭包引入

function f1(){
    a++;
    console.log(a);
}
f1();//11
f1();//12
f1();//13
//方法内对全局变量做操作
//全局变量易被修改,不安全
a=100;
f1();//101

function f2(){
    var b=10;
    b++;
    console.log(b);
}
f2();//11
f2();//11
f2();//11
//局部变量在调用后会被销毁,操作不能复用
function fn(){
    var a = 10;
    return function(){
        a++;
        console.log(a);
    }
}
var fn1 = fn();
fn1();//11
fn1();//12
fn1();//13

a作为局部变量,具有安全性

从结果11,12,13得出,方法具有复用性

分析:

1.使用执行的行数就是把out方法的放回值赋值给全局变量fn

即:

var fn=function (){
    a++;
    console.log(a);
}

2.细致分析

(1)代码第1行,声明函数fn,形成作用链

(2)代码第3行,声明匿名函数,形成作用域链

(3)代码第8行,执行fn函数,填充fn函数的作用域

(4)代码第8行,使用执行的行数就在使用它的返回值,给内层函数命名为fn1

(5)代码第8行,fn函数执行完毕释放自己的局部作用域,销毁局部变量a。但是由于被内层函数(fn1)引用着,释放失败,a得以保留

(6)代码第9行,执行fn1,填充fn1的局部作用域

执行fn1,使用变量a,自己的局部本不存在a,顺着作用域链向下找,在第二层fn的局部找到并使用a。fn执行完毕,释放自己的局部作用域,不会向下释放,所以a得以保留

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不背完3500个考研英语词汇不改名

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值