call bind apply

call bind apply 改变函数中的this

call

函数是一个对象
var fn = new Function();
function fn() {
}

证明fn是Function的实例(对象)
console.log(fn.__proto__ === Function.prototype);

console.dir(fn);

function fn(x, y) {
console.log(this);
console.log(x + y);
}

fn(5, 6); // this->window

1 调用函数,改变函数中的this
2 第一个参数 设置函数内部this的指向
其它参数,对应函数的参数
3 函数的返回值 call的返回值就是函数的返回值
4 测试
var obj = {
name: 'zs'
}
fn.call(obj, 5, 6);


apply 只有两个参数
1 调用函数,改变函数中的this
2 第一个参数 设置函数内部this的指向
第二个参数 是数组
3 函数的返回值 call的返回值就是函数的返回值
4 测试
var obj = {
name: 'ls'
}
fn.apply(obj, [1, 2]);

应用

var obj = {
0: 100,
1: 10,
2: 11,
3: 20,
length: 4
};
// obj['4'] = 30;
// obj.length ++;

// console.dir(obj);

Array.prototype.push.call(obj, 30);
Array.prototype.splice.call(obj, 0, 3);
console.dir(obj);


var obj = {
name: 'zs'
};

console.log(obj.toString());

var arr = [5, 9];
console.log(arr.toString());

console.log(Object.prototype.toString.call(arr));

应用

// fn.apply(,[])

// Math.max(3, 5, 6);

var arr = [5, 10, 1, 3, 6];
// Math.max不能求数组中的最大值
// console.log(Math.max(arr));

console.log(Math.max.apply(null, arr));
console.log(Math.max.apply(Math, arr));

// console.log(1, 2, 3);
// console.log(arr);

console.log.apply(console, arr);


bind
1 改变函数中的this,不会调用函数,而是把函数复制一份
2 第一个参数 设置函数内部this的指向
其它参数,对应函数的参数
3 函数的返回值 call的返回值就是函数的返回值
4 测试
var obj = {
name: 'ww'
}

var f = fn.bind(obj, 5, 5);
f();

bind的应用

var obj = {
name: 'zs',
fun: function() {
setInterval(function() {
console.log(this.name);
}.bind(this), 1000);
}
}
obj.fun();

btn.onclick = function () {
// 事件处理函数中的this 是触发该事件的对象

// 通过bind 改变事件处理函数中this的指向
}.bind(obj);

原文地址:https://www.cnblogs.com/pxxdbk/p/12661378.html