異步,傳入的函數在重繪以前調用 詳細參考: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);
}
}
};
複製代碼