this指向问题

this与哪个对象绑定都属于内部操作,this绑定的对象只取决于函数调用方式,不依赖于函数声明所处位置。 函数有4种调用方式,也就有四种绑定规则:默认绑定隐式绑定硬绑定构造函数绑定

1.默认绑定

当作为普通函数调用的时候,就会发生默认绑定。this指向全局对象window,但是在严格模式下,this的值会变为undefined

function fn1(){
   console.log(this);   //window
}
fn1();
function fn2(){
   "use strict";
   console.log(this);   //undefined
}
fn2();
2.隐式绑定

当作为对象方法调用 的时候,就是隐式绑定,this指向调用该方法的对象

var obj = {
  name: "lxh";
  getName: function(){
    console.log(this.name);   
 }
}
obj.getName();   // lxh
3.硬绑定

通过call( ),bind( ),apply( )修改this为指定的对象,但是如果传入null或undefined的话,this指向为全局对象window,顺带复习一下这三个方法

3.1 bind( ) 修改函数或方法中this为指定对象,并且返回修改之后的新函数,还可以传递参数

3.2 call( ) 修改函数或方法中this为指定对象,并且会立即调用修改之后的新函数,可以传递参数

3.3 apply( ) 修改函数或方法中this为指定对象,并且会立即调用修改之后的新函数,注意点:还可以传递参数,通过数组传参,写在this后面

let obj = { };
function test( myName, myAge ){
   this.name = myName;
   this.age = myAge;
   console.log(this, this.name, this.age);
}
//bind()会返回一个修改之后的新函数,注意点:还可以传递参数,写在this后面
let res = test.bind(obj, "lixiuhua", 21);
res();
//call()会立即调用修改之后的新函数,参数传递和bind()一样
test.call(obj,"lixiuhua",21);
//apply()会立即调用修改之后的新函数,用数组传递参数
test.call(obj,["lixiuhua",21]);
4.构造函数绑定

当用new来调用构造函数时,会创建一个新的对象,构造函数的this会绑定这个新对象(面试问过,当时没答上来)

function func(){
 this.name = "lixiuhua";
 this.getNamw = function(){
    return this.name;
 };
}
var res = new func();
res.getName();    //lixiuhua
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值