点击切换帐号登陆
帐号密码登陆

闭包回调在动画设计中的应用

# 2. 闭包回调在动画设计中的应用

**知识点**
1. 函数式编程
2. 闭包与回调

----------------------------------------------

## 1. 函数式编程
- 代码复用
- 维护方便

----------------------------------------------
## 2. 闭包与回调
- 闭包创建在相互嵌套的函数中
- 闭包中的成员之间都是可见的,闭包函数可以调用与它同级的变量
- 简单来说: 子函数可以访问父函数中的变量,即使父函数作用域已经销毁

----------------------------------------------

### 示例: code/demo03.html

```html
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>闭包回调在动画设计中的应用</title>
    <style>
        #box {
            width: 100px;
            height: 100px;
            border-radius: 50%;
            box-shadow: 1px 1px #999;
            background-color: lightgreen;
            position: relative;
        }

        #box1 {
            width: 100px;
            height: 100px;
            border-radius: 50%;
            box-shadow: 1px 1px #999;
            background-color: lightblue;
            position: relative;
        }
    </style>
</head>
<body>
<div id="box"></div>
<div id="box1"></div>

<script>
    // 全局调用, 每实现一次动画,必须创建三个全局变量: box, tick, timer
    let box = document.getElementById('box');
    let tick = 0;
    let timer = setInterval(function () {
        if (tick < 100) {
            box.style.left = box.style.top = tick + 'px';
            console.log(tick + ': left: '+ box.style.left + ', right: ' + box.style.top);
            tick++;
        } else {
            clearInterval(timer);
        }
    },100);

    let box1 = document.getElementById('box1');
    let tick1 = 0;
    let timer1 = setInterval(function () {
        if (tick < 100) {
            box1.style.left = box1.style.top = tick1 + 'px';
            console.log(tick1 + ': left: '+ box1.style.left + ', right: ' + box1.style.top);
            tick++;
        } else {
            clearInterval(timer1);
        }
    },100);


    // 使用闭包,可以极大的简化代码
    // 创建函数animate, 在内部创建闭包,变量box,tick,与time函数的参数回调,处于同一个词法作用域中,所以回调中可以直接访问
    // 回调函数外部的变量tick,box
    // 使用函数封装后,只会给全局添加一个函数标识符: animate, 并且不论调用多少次,也不会再创建全局成员, 污染全局环境
    function animate(boxId) {
        let box = document.getElementById(boxId);
        let tick = 0;
        let timer = setInterval(function () {
            if (tick < 100) {
                box.style.left = box.style.top = tick + 'px';
                console.log(tick + ': left: '+ box.style.left + ', right: ' + box.style.top);
                tick++;
            } else {
                clearInterval(timer);
            }
        },100);
    }

    animate('box');
    animate('box1');
</script>
</body>
</html>
```


任务

?不会了怎么办
无数据提示暂无评论哟...我要评论
网站导航
标签地图
学习路径
视频教程
开发软件
旗下子站
php中文网
phpstudy
技术文章
文档工具
关于我们
企业合作
人才招聘
联系我们
讲师招募
QQ交流群
QQ官方交流群
微信公众号
微信公众号