JS第三天

一、函数高级

1、函数回调

// 回调的函数
function callback(data) {}
// 逻辑函数
function func(callback) {
    // 函数回调
    if (callback) callback(data);
}

// 函数回调的本质:在一个函数中(调用函数),当满足一定条件,调用参数函数(回调函数)
// 回调函数作为调用函数的参数传入
// 回调函数通过参数将调用还是内部数据传出
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>函数的回调</title>
</head>
<body>
    函数的回调
</body>
<script type="text/javascript">
    // 函数回调
    // 在一个函数(fn)中,满足条件情况下,调用另外一个函数(func)
    // 注:func函数 是 fn函数 的参数(函数作为函数参数传入)

    // 解决问题:
    // 请求数据 => 数据(return | 函数回调) => 外界

    function a_fn(data) {
        console.log('a_fn');
        // 如果要使用数据,那么定义形参接收参数
        console.log(data);
    }

    function b_fn(a_fn) {
        var data = "b_fn 的 数据";
        console.log('b_fn');
        // 条件: a_fn有值(有函数实现体)
        if (a_fn) {
            // 调用参数函数
            a_fn(data);
        }
    }
    b_fn(a_fn);

    // 1.一个函数(函数名)作为另外一个函数的参数
    // 2.满足一定的条件,调用参数函数
    // 3.形成了函数回调,回调的函数可以获取调用函数的局部变量(将数据携带出去)
</script>

<!-- 函数回调在系统中的使用 -->
<script type="text/javascript">
    // 通常情况下,我们的页面标签存不存在点击事件? => 存在
    // 点击事件触发后,可不可以对外传送数据 => 可以,eg:点在页面的什么位置
    // 系统已经书写好了这种函数回调,但是没有回调体,回调体(回调函数)由普通开发者提供

    // 钩子:满足条件情况下被系统回调的函数(方法),称之为钩子函数(方法) <=> 回调函数
    document.onclick = function (a, b , c) {
        console.log("点击事件");
        console.log(a, b , c);
    }
</script>
</html>

2、闭包

function outer() {
    var data = {}
    function inner() {
        return data;
    }
    return inner;
}

// 闭包目的:不允许提升变量作用域时,该函数的局部变量需要被其他函数使用
// 闭包本质:函数的嵌套,内层函数称之为闭包
// 闭包的解决案例:①影响局部变量的生命周期,持久化局部变量;②解决变量污染
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>闭包</title>
</head>
<body>
    闭包
</body>
<script type="text/javascript">
    // 闭包: 函数的嵌套定义,内层函数就是闭包
    // 闭包产生的原因: 
    // 1.函数会产生局部作用域, 外部需要使用 -- 返回值 | 函数回调 | 闭包 | 提升作用域
    // 2.在外部另一个函数中使用该局部变量 -- 函数回调 | 闭包
    // 3.不能使用函数回调(函数已有固定参数,或不能拥有参数),只能将函数定义到拥有局部变量函数的内部 => 闭包
    // 总结:一个函数要使用另外一个函数的局部变量


    // 提升作用域
    var a;  // 作用域被提升
    function fn() {
        a = 10;  // 局部变量 => 在外部定义
    }
    fn();
    // 外部使用局部变量: 返回值 | 函数回调 | 闭包 | 提升作用域
    console.log(a);


    // 好处: 
    // 1.外部函数a_fn不需要强制拥有参数以及返回值
    // 2.外部函数的局部变量也无需提升作用域,可以保证参数的安全性
    // 3.内部函数b_fn也不需要强制拥有参数与返回值,便可以直接使用外部函数a_fn的局部变量data
    function a_fn() {
        var data = [1, 2, 3, 4, 5];
        // 闭包
        function b_fn() {
            console.log('>>>', data);
        }
        b_fn();
    }
    a_fn();
    // 闭包使用:
    // 外部函数在外部调用
    // 内部函数在(外部函数)内部调用


    // 就是闭包可以解决哪些问题
    // 1.局部变量的持久化
    // 2.变量污染(页面标签循环绑定)

</script>
</html>

二、循环绑定

.html文件
<ul>
    <li>列表项</li>
    <li>列表项</li>
    <li>列表项</li>
</ul>
.js文件
var lis = document.querySelector('li');
for (var i = 0; i < lis.length; i++) {
    lis[i].onclick = function () {
        // 打印列表项的索引
        console.log(i);
    }
}
// 变量污染
// 获取局部作用域解决
// 闭包解决
// 对象属性解决

1、使用闭包解决局部变量生命周期

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>局部变量生命周期</title>
</head>
<body>
    局部变量生命周期
</body>
<script type="text/javascript">
    function outer() {
        // eg: 请求得到的数据,如何不持久化,方法执行完毕后,数据就会被销毁
        var data = [1, 2, 3, 4, 5];
        console.log(data);
        // 通过闭包解决该类问题,所以闭包所以代码均可以随意自定义
        function inner() {
            return data;
        }
        // 数据被inner操作返回,inner属于outer,属于需要outer将inner返回出去(跟外界建立起联系)
        return inner;
    }
    // 将局部变量生命周期提升于inner函数相同,inner存在,局部变量data就一直存在
    var inner = outer();
    console.log(inner());

</script>
</html>

2、使用闭包解决变量污染问题

/* .css */
ul {
    margin: 0;
    padding: 0;
    list-style: none;
}
li {
    width: 80px;
    height: 35px;
    background-color: pink;
    border-radius: 5px;
    float: left;
    margin-left: 3px;
}
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>闭包解决变量污染</title>
    <!-- .html -->
</head>
<body>
    
    <ul>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</body>
</html>
// .js
// 需求:点击li,打印li在ul中的索引 => 0, 1, 2, 3, 4
// 1.lis 
var lis = document.querySelectorAll('ul li');
// 2.循环绑定
for (var i = 0; i < lis.length; i++) {
    // 解决的原理:一共产生了5个外层函数,存储的形参i的值分别是0, 1, 2, 3, 4
    // 内层函数也产生了5个,且和外层函数一一对应,打印的i就是外层函数的形参i

    // 外层函数
    (function (i) {
        // 内层函数:闭包
        lis[i].onclick = function () {
            alert(i)
        }
    })(i)   
}
console.log(i);  // 点击事件触发一定晚于该逻辑语句
// 所以再去触发点击,弹出i的值,永远是5

// 该类问题就称之为变量污染

3、利用块级作用域解决循环绑定

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>块级作用域解决循环绑定</title>
    <style type="text/css">
        ul {
            margin: 0;
            padding: 0;
            list-style: none;
        }
        li {
            width: 80px;
            height: 35px;
            background-color: pink;
            border-radius: 5px;
            float: left;
            margin-left: 3px;
        }
    </style>
</head>
<body>
    <ul>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</body>
<script type="text/javascript">
    // ES6语法中支持块级作用域

    let lis = document.querySelectorAll('li');
    for (let i = 0; i < lis.length; i++) {
        lis[i].onclick = function () {
            alert(i)
        }
    }
</script>
</html>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,097评论 1 32
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,148评论 0 13
  • 官方中文版原文链接 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大...
    HetfieldJoe阅读 2,303评论 0 21
  • 1.本地推送 就像设置闹钟一样 (设置什么内容在里面就可以推送了)固定时间进行推送给用户 2.远程推送流程 3.激...
    叶君臣阅读 223评论 0 0
  • 读书营这个环境非常有利于我成长,可是我却没有利用好这个环境和平台。一是过度不自信,总感觉自己还需要更加精进,更加优...
    姜糊仁yyds阅读 182评论 0 0