我是靠谱客的博主 伶俐微笑,最近开发中收集的这篇文章主要介绍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

最后

以上就是伶俐微笑为你收集整理的this指向问题的全部内容,希望文章能够帮你解决this指向问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部