異步,傳入的函數在重繪以前調用 詳細參考:css
捕獲 冒泡vue
Function.prototype.a = 'a'; Object.prototype.b = 'b'; function Person(){}; var p = new Person(); console.log('p.a: '+ p.a); // p.a: undefined console.log('p.b: '+ p.b); // p.b: b 複製代碼
const person = { namea: 'menglinghua', say: function (){ return function (){ console.log(this.namea); }; } }; person.say()(); // undefined 複製代碼
const person = { namea: 'menglinghua', say: function (){ return () => { console.log(this.namea); }; } }; person.say()(); // menglinghua 複製代碼
setTimeout(() => console.log('a'), 0); var p = new Promise((resolve) => { console.log('b'); resolve(); }); p.then(() => console.log('c')); p.then(() => console.log('d')); console.log('e'); // 結果:b e c d a // 任務隊列優先級:promise.Trick()>promise的回調>setTimeout>setImmediate 複製代碼
async function async1() { console.log("a"); await async2(); //執行這一句後,await會讓出當前線程,將後面的代碼加到任務隊列中,而後繼續執行函數後面的同步代碼 console.log("b"); } async function async2() { console.log( 'c'); } console.log("d"); setTimeout(function () { console.log("e"); },0); async1(); new Promise(function (resolve) { console.log("f"); resolve(); }).then(function () { console.log("g"); }); console.log('h'); // 誰知道爲啥結果不同????????????? // 直接在控制檯中運行結果: d a c f h g b e // 在頁面的script標籤中運行結果:d a c f h b g e 複製代碼
// 代碼來自書籍 《javaScript 模式》 if (typeof Function.prototype.bind === "undefined"){ Function.prototype.bind = function (thisArgs){ var fn = this, slice = Array.prototype.slice, args = slice.call(arguments, 1); return function (){ return fn.apply(thisArgs, args.concat(slice.call(arguments))); } } } 複製代碼
// 參照 vue 源碼實現 var EventEmiter = function (){ this._events = {}; }; EventEmiter.prototype.on = function (event, cb){ if (Array.isArray(event)){ for (let i = 0, l = event.length; i < l; i++){ this.on(event[i], cb); } } else { (this._events[event] || (this._events[event] = [])).push(cb); } return this; }; EventEmiter.prototype.once = function (event, cb){ function on () { this.off(event, cb); cb.apply(this, arguments); } on.fn = cb; this.on(event, on); return this; }; EventEmiter.prototype.off = function (event, cb){ if (!arguments.length){ this._events = Object.create(null); return this; } if (Array.isArray(event)){ for (let i = 0, l = event.length; i < l; i++){ this.off(event[i],cb); } return this; } if (!cb){ this._events[event] = null; return this; } if (cb){ let cbs = this._events[event]; let i = cbs.length; while(i--){ if (cb === cbs[i] || cb === cbs[i].fn){ cbs.splice(i, 1); break; } } return this; } }; EventEmiter.prototype.emit = function (event){ let cbs = this._events[event]; let args = Array.prototype.slice.call(arguments, 1); if (cbs){ for (let i = 0, l = cbs.length; i < l; i++){ cbs[i].apply(this,args); } } }; 複製代碼