概述
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
最后
以上就是伶俐微笑为你收集整理的this指向问题的全部内容,希望文章能够帮你解决this指向问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复