Call呼叫:呼叫函式的方法,并且能指定 this 值。
用法:函式名.call(指定的this变数(参数))。
var myName = '真心镇大冒险'; var family = { myName: '小明家', } function fn(para1, para2) { console.log(this, typeof this, para1, para2); } fn(1, 2); fn.call(family, 1, 2);
解:
fn(1, 2):此时的this,属于一般呼叫(简易呼叫),所以变数会选择全域的变数。fn.call(family, 1, 2):可以指定this呼叫的变数。这边选择family。let obj = {};function foo() { console.log(this);}foo(); // "Window{}"foo.call(obj); // Object{}
apply呼叫:呼叫函式的方法,并且能指定 this 值。
用法:函式名.apply(指定的this变数[参数])。
var myName = '真心镇大冒险'; var family = { myName: '小明家', } function fn(para1, para2) { console.log(this, typeof this, para1, para2); } fn(1, 2); fn.apply(family, [3, 4]);
let obj = {};function foo() { console.log(this);}foo(); // "Window{}"foo.apply(obj); // Object{}
let obj = {};function foo(a, b) { console.log(this, a, b);}foo.call(obj, 1, 2); // Object{} 1 2foo.apply(obj, [1, 2]); // Object{} 1 2
此模式被称为硬绑定(hard binding) 指的是绑定既明确又不会意外变回预设的绑定。
利用函式bind(),当被呼叫的时候,指定this值。
var myName = '真心镇大冒险'; var family = { myName: '小明家', } function fn(para1, para2) { console.log(this, typeof this, para1, para2); } fn(1, 2); var fn2 = fn.bind(family, '小明'); fn2(1);
注意:此时的fn2(1)看起来会很像是简易呼叫!!但是本质不是
参考文章:
JavaScript 的 this:https://chupainotebook.blogspot.com/2019/09/javascript-this.html