1.世界尽头,指向window,备胎
比如:
functionfn(){
console.log(this);
};
fn();
2.点石成金,就是点 . 前面的对象或者方法
比如:
function fn(){
console.log(this);
}
var b1={
name:”yuexiaomei”,
f:fn
}
b1.f(); //b1
3.指腹为婚
Object.prototype.call和Object.prototype.apply,可以通过参数指定this,从而来改变this的指向
比如:
var b={
name:’yuexiaomei’,
f1(){
console.log(this.name);
}
}
var b1={
name:’xiao’,
}
b.f1.call(b1); //xiao
4.海誓山盟
Object.prototype.bind,他不但通过新函数来提供永久的绑定,还会覆盖第三层大佬的命令。
function returnThis () {
return this
}
var boss1 = { name:
'boss1'}
var boss1returnThis =
returnThis.bind(boss1)
boss1returnThis() //
boss1
var boss2 = { name:
'boss2' }
boss1returnThis.call(boss2)// still boss1
5.内有乾坤
当我们new一个函数时,就会自动把this绑定在新对象上,然后再调用这个函数,会覆盖bind的绑定。
New操作符干了哪些事情
(1)创建了一个新的空对象
(2)将this指向新的对象,并绑定了构造函数的prototype里面的方法
(3)执行构造函数里面的代码(为这个新的对象添加属性)
(4)返回新的对象
call,apply,bind三个的使用区别:
都是用来改变函数的this对象的指向的;
第一个参数都是this要指向的对象;
都可以利用后续参数传参;
bind是返回对应函数,便于稍后调用,apply、call是立即调用;
function showThis () {
console.log(this);
}
showThis() // window
new showThis() //showThis ====相当于创建了一个新的对象也叫showThis,然后调用该函数
var boss1 = {
name:'boss1';
}
showThis.call(boss1) //
boss1
new showThis.call(boss1)// TypeError showThis.call is not aconstructor
var boss1showThis =showThis.bind(boss1)
boss1showThis() // boss1
newboss1showThis() // showThis
6.军令如山
箭头函数,箭头函数里的this不在妖艳,被永远封印在当前词法作用域之中,在代码运行前就可以确定了,灭掉其他大佬可以覆盖。所以对于箭头函数,重要看他在哪里创建的就行。
function callback (cb) {
cb()
}
callback(() => {
console.log(this) }) // window
var boss1 = {
name:
'boss1',
callback:
callback,
callback2 ()
{
callback(()
=> { console.log(this) })
}
}
boss1.callback(() => {
console.log(this) }) // still window
boss1.callback2(()=> { console.log(this) }) // boss1 callback2在定义的时候是属于boss1这个词法作用域的
网友评论