JavaScript this的指向和改变this指向的方法

一、js 中 this 是什么

this 是函数执行时所在的上下文环境

二、this 的指向

js 全局对象:在 html 页面中引入的 js 文件 全局对象 是 window 对象,使用 node 命令执行 js 文件 全局对象 是 global 对象

1. 在 js 文件外层 this 指向 全局对象

console.log(this); // 全局对象

2. 在函数中 this 指向

  1. 在严格模式下,this 指向的是 undefined
"use strict";
function a() {
  console.log(this); // undefined
}
a();
  1. 在非严格模式下,如果把函数当作构造函数使用:this 指向这个构造函数创建的实例对象
// 构造函数
function A() {
  this.name = "alias";
  this.age = 20;
  this.show = ()=>{
    console.log(this);
  }
}
console.log(new A()); // {name: 'alias', age: 20}
new A().show() // {name: 'alias', age: 20}
console.log(window.age); // undefined , 说明构造函数中的this不指向全局对象
  1. 在非严格模式下,如果把函数当作普通函数调用:this 指向函数运行时所在的上下文环境
    即:在 script 标签外层的调用函数:this 指向全局对象,以对象的方法的方式调用函数:this 指向方法所在的对象
// 外层直接调用:this 是全局对象
function a() {
  this.username = "alias";
  this.password = 123456;
}
a();
console.log(window.username); // alias
console.log(this.username); // alias
// 对象方法:this 的指向取决于调用对象方法的方式
const objB = {
  xcxv: "xcxv",
  getXcxv() {
    console.log(this.xcxv);
  },
};

objB.getXcxv(); // alias , 以对象的方法的方式调用:this 指向对象方法所在的对象

const bbb = objB.getXcxv;
bbb(); // undefined, 将对象的方法取出并在 script 标签外层调用:this 指向全局对象
  1. 在事件中 this 指向当前事件所在的 dom 元素
<div onclick="show(this)">hello world</div>
<script>
  function show(params) {
    console.log(params); // 当前dom元素 <div onclick="show(this)">hello world</div>
  }
</script>

三、临时改变 this 指向的三个方法 call、apply、bind

  1. call、apply、bind 三者都可改变 this 的指向,且都只是临时的改变 this 的指向
  2. call 和 bind 方法传参方式一样,第一个参数是 this 指向的实例对象,其他是方法参数,以逗号隔开,区别是 bind 方法不立即执行,需要以方法的方式调用
  3. apply 方法,第一个参数是 this 指向的实例对象,其他是方法参数,放在数组中以逗号隔开
  1. call、apply、bind 方法使用示例
// 让 A 的 this 指向 B,并调用 A 函数,此时 A 和 B 的实例属性会合并
function A(p1, p2) {
  this.a = 'AAAAA' 
  this.p1 = p1
  this.p2 = p2
  console.log(this);
}
var B = { b: "BBBBB" };
A.call(B, "x", "xx"); // 结果: { name: 'B' } x xx
A.apply(B, ["x", "xx"]); // 结果: { name: 'B' } x xx
A.bind(B, "x", "xx")(); // 结果: { name: 'B' } x xx

new A() //结果: {a: 'AAAAA', p1: undefined, p2: undefined},说明改变 this 指向只是临时的
  1. 在借用构造函数继承中,使用 call、apply,让子类继承父类的实例属性
// 父类
function A() {
    this.name = "AAAAAAA";
    this.age = 18;
}
// 子类
function B() {
    this.BBBBB = "BBBBB"; // 与父类不同名的属性可以写在  A.call(this) 上面

    A.call(this)  // 将父类 A 的 this 指向子类 B 实例对象,并执行 A,此时 A 和 B 的实例属性会合并,也就是B继承了A实例属性(函数中this总是指向实例对象)
    
    this.name = "B"; // 与父类同名的属性要写在 A.call(this) 下面,否则会在 A.call(this) 时被父类属性覆盖掉
}
console.log(new (A)); // {name: 'AAAAAAA', age: 18}
console.log(new (B)); // {BBBBB: 'BBBBB', name: 'B', age: 18}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容