闭包
最后更新于
for ( var i=1; i<=5; i++) {
setTimeout( function timer() {
console.log( i );
}, i*1000 );
}for(var i=1;i<=5;i++){
(function(j){
setTimeout( function timer() {
console.log( j );
}, j*1000 );
})(i)
}for ( let i=1; i<=5; i++) {
setTimeout( function timer() {
console.log( i );
}, i*1000 );
}function Foo() {
var i = 0;
return function() {
console.log(i++);
}
}
var f1 = Foo(),
f2 = Foo();
f1();
f1();
f2();f1();//0
f1();//1f2();//2f2();//0const Foo = (function() {
var i = 0;
return function() {
console.log(i++);
}
})()
var f1 = Foo,
f2 = Foo;
f1(); // 0
f1(); // 1
f2(); // 2// 根据Vue的$watch原理实现的简易版$watch
Vue.prototype.$watch = function(exp, cb, options = {immediate: true, deep: false}) {
let watcher = new Watcher(this, exp, cb, options);
return () => {
watcher.unWatch();
};
}
let obj = {
name: 'kiner',
age: 20
};
// 监听obj.name的改变
let unWatchName = this.$watch("obj.name",function(newVal, oldVal){
console.log(`新值:${newVal};旧值:${oldVal};`);
});
// 取消监听,取消后,obj.name的改变不再会通知
unWatchName()
const Id2NameMap = {};
const getNameById = function (id) {
if (Id2NameMap[id]) return Id2NameMap[id];
return new Promise(resolve => {
mockGetNameById(id, function (name) {
Id2NameMap[id] = name;
resolve(name);
})
});
}
Promise.resolve(getNameById(id)).then(name => {
console.log(name);
});/**
* Ensure a function is called only once.
*/
export function once (fn: Function): Function {
let called = false
return function () {
if (!called) {
called = true
fn.apply(this, arguments)
}
}
}