美文网首页
@芥末的糖

@芥末的糖

作者: 芥末的糖 | 来源:发表于2018-11-30 23:15 被阅读0次

1.接下来是一段有故事的代码,如果你能看到最后,那么我相信,这些干货将会让你受益

for (var i = 0; i < 3; i++) {
    setTimeout(function() {
        console.log("循环内:" +i);
    }, 1000);
}
console.log("循环外:" +i);
//循环外:3   ③循环内:3

2.要求变成//循环外:3 循环内:0,1,2

使用闭包

for (var i = 0; i < 3; i++) {
    (function(j) {  
        setTimeout(function() {
            console.log( "循环内:" +j);
        }, 1000);
    })(i);
}

console.log("循环外:" + i);
//循环外:3 循环内:0 循环内:1 循环内:2 

使用函数调用

var obj= function (i) {
    setTimeout(function() {
        console.log("循环内:" +i);
    }, 1000);
};

for (var i = 0; i < 3; i++) {
    obj(i);  // 这里传过去的 i 值被复制了
}

console.log("循环外:" + i);
//循环外:3 循环内:0 循环内:1 循环内:2 

上述代码修改成输出: 0 -> 1 -> 2 -> 3

3.ES6

const tasks = [];
for (var i = 0; i < 3; i++) {   
    ((j) => {
        tasks.push(new Promise((resolve) => {
            setTimeout(() => {
                console.log("循环内:" + j);
                resolve();  // 要 resolve
            }, 1000 * j);   // 定时器的超时时间逐步增加
        }));
    })(i);
}

Promise.all(tasks).then(() => {
    setTimeout(() => {
        console.log("循环外:" + i);
    }, 1000);   // 设置为 1 秒
});
//循环内:0循环内:1循环内:2循环外:3

4.ES7

// 模拟其他语言中的 sleep,实际上可以是任何异步操作
const sleep = (timeountMS) => new Promise((resolve) => {
    setTimeout(resolve, timeountMS);
});

(async () => {  // 声明即执行的 async 函数表达式
    for (var i = 0; i < 5; i++) {
        await sleep(1000);
        console.log(new Date, i);
    }

    await sleep(1000);
    console.log(new Date, i);
})();
//循环内:0循环内:1循环内:2循环外:3

附加一段异步代码同步执行的逻辑

  var p1 = new Promise(function (resolve, reject) {
        setTimeout(function () {
            console.log('1');
            resolve()
        }, 3000)
    })
    function p2() {
        return new Promise(function (resolve, reject) {
            setTimeout(function () {
                console.log("2");
                resolve();
            }, 2000)
        })
    }
    function p3() {
        return new Promise(function (resolve, reject) {
            setTimeout(function () {
                console.log("3");
                resolve();
            }, 1000)
        })
    }
    function p4() {
        return new Promise(function (resolve, reject) {
            setTimeout(function () {
                console.log("4");
                resolve();
            }, 500)
        })
    }
    p1.then(function () {
        return p2()
    })
        .then(function () {
            return p3();
        })
        .then(function () {
            return p4();
        })

new 的实现

// new 的实现
function Person(name, age) {
  this.name = name
   this.age = age
  console.log(this)
}
Person.prototype.have = 'cat'
function fakenews(Fn) {
// 创建一个空对象
  let obj = new Object()
 // 将新对象的原型指针指向构造函数的原型
  obj.__proto__ = Fn.prototype
  // 处理除了Fn以外的参数
  // [].slice:返回数组中的一段,在这里是返回arguments数组第一个数以后的所有数
  // 将[].slice看作Fn,这里其实就是将[].slice的指向改为arguments
  Fn.apply(obj, [].slice.call(arguments, 1))
 return obj
}
const person = fakenews(Person, "张三", "20")
console.log(person.name)
console.log(person.age)
console.log(person.have)

。。。未完待续

相关文章

  • @芥末的糖

    1.接下来是一段有故事的代码,如果你能看到最后,那么我相信,这些干货将会让你受益 2.要求变成//循环外:3 ...

  • @芥末的糖-----redux

    以下例子如果看不懂,就直接看总结,然后看最开始的图,然后对应代码目录结构:都在同一个目录下 1.全局注入 2.全局...

  • @芥末的糖-----PropTypes

    1.导入一个包 import PropTypes from 'prop-types' 2.使用PropTypes用...

  • @芥末的糖-----this.setState

    React通过this.state来访问state,通过this.setState来更新state。当setSta...

  • @芥末的糖-----Vuex知识

    一 1.什么是Vuex? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用...

  • @芥末的糖-----TypeScript学习

    女友御用版TS解析 优势: -增加了代码的可阅读和可维护性 安装: 一.基础类型 布尔值 数字 number 字符...

  • @芥末的糖-----fs模块

    用node实现一个检索一个目录下面所有的文件的方法

  • 单词积累之调料(1)

    ①盐:salt ②醋:vinegar ③糖:sugar ④酱油:sauce ⑤芥末:mustard ⑥葱:shal...

  • 北海道 六花亭六色酒心糖 名古屋芥末虾片 又是仙贝故里的一款明星产品,有芥末味,但是不会太刺激,鲜虾味和淡淡芥末味...

  • @芥末的糖-----组件的定义

    1.无状态组件,函数式组件, 影子组件,傻瓜组件,UI组件 2.类的定义 总结:类的组件形式相对于函数化组件更消耗性能

网友评论

      本文标题:@芥末的糖

      本文链接:https://www.haomeiwen.com/subject/tfikcqtx.html