当前位置: 首页 > news >正文

JavaScript学习笔记(十一):this使用指南

JavaScript this 详解

在 JavaScript 中,this 是一个关键字,指向当前执行代码的上下文对象。它的值取决于函数的调用方式,而非定义位置。以下是 this 的几种绑定规则:

  • 默认绑定:独立函数调用时,this 指向全局对象(非严格模式)或 undefined(严格模式)。

    function foo() {console.log(this); // 全局对象或 undefined
    }
    foo();
    

  • 隐式绑定:通过对象调用方法时,this 指向调用该方法的对象。

    const obj = {name: "Alice",greet: function() {console.log(this.name); // "Alice"}
    };
    obj.greet();
    

  • 显式绑定:通过 callapplybind 强制指定 this 的值。

    function greet() {console.log(this.name);
    }
    const obj = { name: "Bob" };
    greet.call(obj); // "Bob"
    

  • new 绑定:构造函数调用时,this 指向新创建的对象实例。

    function Person(name) {this.name = name;
    }
    const alice = new Person("Alice");
    console.log(alice.name); // "Alice"
    

  • 箭头函数:箭头函数没有自己的 this,继承外层作用域的 this

    const obj = {name: "Charlie",greet: () => {console.log(this.name); // 继承外层 this(可能是全局对象)}
    };
    obj.greet();
    


典型应用场景

  • 对象方法调用:通过对象调用方法时,this 指向该对象。

    const calculator = {value: 0,add: function(num) {this.value += num;}
    };
    calculator.add(5);
    console.log(calculator.value); // 5
    

  • 事件处理:DOM 事件回调中,this 通常指向触发事件的元素。

    document.getElementById("btn").addEventListener("click", function() {console.log(this); // 指向按钮元素
    });
    

  • 构造函数:通过 new 创建实例时,this 指向新对象。

    function Car(brand) {this.brand = brand;
    }
    const myCar = new Car("Toyota");
    console.log(myCar.brand); // "Toyota"
    

  • 显式绑定:需要强制指定上下文时,使用 callapplybind

    function logName() {console.log(this.name);
    }
    const person = { name: "Dave" };
    logName.bind(person)(); // "Dave"
    


改变this指向的方法

  • Function.prototype.call:立即执行函数并指定this和参数列表
  • Function.prototype.apply:类似call但接受数组参数
  • Function.prototype.bind:创建新函数并永久绑定this
  • 箭头函数:继承定义时的上下文this
    const boundFunc = showThis.bind(obj);
    boundFunc();  // this始终指向obj


注意事项

  • 严格模式影响:严格模式下,默认绑定的 thisundefined,避免意外修改全局对象。

    "use strict";
    function foo() {console.log(this); // undefined
    }
    foo();
    

  • 箭头函数陷阱:箭头函数的 this 不可更改,且继承自定义时的上下文。

    const obj = {name: "Eve",greet: function() {setTimeout(() => {console.log(this.name); // "Eve"(继承 greet 的 this)}, 100);}
    };
    obj.greet();
    

  • 回调函数丢失 this:将对象方法作为回调传递时可能丢失 this

    const obj = {name: "Frank",greet: function() {console.log(this.name);}
    };
    setTimeout(obj.greet, 100); // 输出 undefined(this 指向全局)
    

  • 嵌套函数问题:嵌套函数中的 this 可能不符合预期,需使用闭包或箭头函数。

    const obj = {name: "Grace",greet: function() {function inner() {console.log(this.name); // undefined(默认绑定)}inner();}
    };
    obj.greet();
    


总结与建议

  • 明确 this 的绑定规则,根据调用方式判断其指向。
  • 需要固定 this 时,优先使用箭头函数或 bind
  • 避免在回调中直接传递对象方法,可用匿名函数包装或提前绑定。
  • 在构造函数中确保通过 new 调用,否则 this 可能指向全局对象。
  • 使用严格模式减少意外行为,提升代码安全性。

通过理解 this 的动态特性,可以更灵活地控制函数上下文,避免常见陷阱。

http://www.dtcms.com/a/408030.html

相关文章:

  • 深圳网络公司做网站网站设计心的
  • 用vs2008做网站视频教程保世基官方网站建设
  • 网站突然被降权怎么办wordpress 重装
  • 网站备案幕布可以ps么小程序企业官网
  • 【MySQL✨】MySQL 入门之旅 · 第十二篇:MySQL 数据库设计与规范
  • 备案期间网站怎么关闭wordpress注册插件中文版
  • 网站的建设的含义厦门app网站设计
  • 198种组合算法+优化BiLSTM神经网络+SHAP分析+新数据预测+多输出!深度学习可解释分析,强烈安利,粉丝必备!
  • 银川建立网站装修公司做宣传在哪个网站
  • numpy -- 修改数组形式
  • QT绘画系统
  • anker 网站谁做的优化网站的步骤
  • 2.配置DNS服务器过程
  • 外国的网站 ftp做网站运营经理的要求
  • 办网站需流程wordpress 主题制作教程
  • 漫谈《数字图像处理》之图像模式识别的核心方法论
  • 雅虎网站收录入口南京开发
  • 外贸网站推广平台哪个好网站自动加水印
  • 少样本学习论文分享:多模态模型和元学习
  • 电动剃须刀MCU控制方案开发知识分享
  • html5的网站设计与实现是做什么网络优化工程师是干什么的
  • 有什么网站用名字做图片大全记事本做网站素材代码
  • 《机器学习与深度学习》入门
  • 六安网站自然排名优化价格网站没有备案时
  • 阿里云做企业网站用php怎么做网站
  • Qt常用控件之QLabel(二)
  • C++笔记(基础)动态内存管理 auto,decltype关键字
  • 申请网站沈阳网站建设招标公司
  • 网站统计 中文域名建站之星极速版
  • python中Pydantic学习笔记