文章目录
问题案例
for (var i=0; i<5; i++) {
setTimeout(function () {
console.log(i);
}, 1000)
}
1秒后 输出 5个5
预期1,1秒后 输出 0,1,2,3,4
// 使用let
for (let i=0; i<5; i++) {
setTimeout(function () {
console.log(i);
}, 1000)
}
// 使用setTimout最后一个参数,传到第一个参数的入参里
for (let i=0; i<5; i++) {
setTimeout(function (j) {
console.log(j);
}, 1000, i)
}
// 使用自执行函数包裹着定时器,传i到新的函数里
for (let i=0; i<5; i++) {
(function (j) {
setTimeout(function () {
console.log(j);
}, 1000)
})(i)
}
// 每隔1秒输出一个数字
for (let i=0; i<5; i++) {
(function (j) {
setTimeout(function () {
console.log(j);
}, j*1000)
})(i)
}
call、apply、bind
有关于this
指向的习题
// 实现call
Function.prototype.myCall = function(_this, ..._args){
_this = _this ? Object(_this) : window;
_this['_newFunc'] = this;
_this._newFunc(..._args)
delete _this._newFunc; //删除fn
}
// 实现apply
Function.prototype.myApply = function(_this, _args){
_this = _this ? Object(_this) : window;
_this['_newFunc'] = this;
_this._newFunc(..._args)
delete _this._newFunc; //删除fn
}
// 实现bind
Function.prototype.myBind = function(_this, ..._args){
_this = _this ? Object(_this) : window;
_this['_newFunc'] = this;
return function(){
_this._newFunc(..._args)
}
}
var obj1 = {
name: "张三",
age: 18,
fn: function (city,love) {
console.log(this.name,this.age,city,love);
}
}
var obj2 = {
name: "李四",
age: 20
}
obj1.fn.myCall(obj2, '上海', 'lisiniang')
obj1.fn.myApply(obj2, ['上海', 'lisiniang'])
obj1.fn.myBind(obj2, '上海', 'lisiniang')()