this指向谁(已完结)

本文详细解析了JavaScript中this关键字的指向规则,介绍了四种主要的函数调用模式:函数调用模式、方法调用模式、构造器调用模式以及call()/apply()调用模式,并通过实例说明了每种模式下this的具体指向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

this指向谁?

this指向谁,取决于函数的调用模式

在JS中函数的调用模式共四种:

函数调用模式——this指向window

直接使用函数名调用,或者使用指向函数引用的标识符调用函数即为函数调用模式

例如:

    function test(){
        console.log(this);
    }
    test()//函数调用模式

    var fun = test;
    fun();//函数调用模式

    /*-----------*/

    var obj = {
        test : test,
        fun : function (){
            console.log(this);
        }
    }
    var foo = obj.test;
    foo();//函数调用模式

    var bar = obj.fun;
    bar();//函数调用模式
方法调用模式——this指向某个对象

当一个函数被保存为对象的一个属性时,称该函数为方法。使用‘.’或‘[‘指向函数引用的属性’]’去调用方法我们称之为方法调用模式

例如:

    var a = 111;
    function test(){
        console.log(this.a + '-a');
    }
    var obj = {
        a : 222,
        test : test,
        fun : function (){
            console.log(this.a + '-b');
        }
    }
    obj.test();//222——方法调用模式
    obj.fun();//222——方法调用模式
构造器调用模式(new)——this指向构造函数内创建的新对象

对于这种模式下的this指向不用多说,因为算是比较简单了。但请注意下列问题:

  • 在JS中,构造函数只是一些使用new操作符时被调用的普通函数,因此与其他函数并没有特别之处
call()/apply()调用模式——this指向传入的对象

对于这种模式下的this指向也不多说!但注意以下问题:

  • 当你使用call/apply改变this指向时,如果你传入的是除undefined与null之外的原始值(string/boolean/number),那么这个原始值会转换为它的对象形式(即new String/Boolean/Number(…))

  • 如果传入的时undefined/null,在非严格模式下this指向window,严格模式下this指向undefined/null

小练习:

    var name = '222';
    var a = {
        name:'111',
        say:function () {
             console.log(this.name);
        }
    }

    var fun = a.say;
    fun(); 
    a.say(); 
    var b = {
    name: '333',
    say: function (fun) {
        fun();
    }
    b.say(a.say);
    fun();
    b.say = a.say;
    b.say();

ps:本文案参考了以下书籍
《你不知道的JavaScript》
《JavaScript语言精粹》

<think>好的,我现在需要解释JavaScript中函数的this指向问题。用户可能对this的理解有困惑,特别是不同情况下它的指向变化。首先,我得回顾一下this的基本概念,它指向调用函数的上下文对象,但具体行为取决于函数的调用方式。 接下来,我应该分情况讨论不同的调用方式。首先是普通函数调用,这时候this默认指向全局对象(在浏览器中是window,Node.js中是global)。不过严格模式下会是undefined,这点要提到。然后是作为对象的方法调用this指向调用方法的对象。这里可能需要举例说明,比如obj.method()中的this是obj。 接下来是构造函数调用,使用new关键字时,this会绑定到新创建的对象实例上。这部分需要解释new的过程,包括创建新对象、绑定原型、执行构造函数等步骤。然后要考虑call、apply、bind这些显式绑定方法,它们可以强制指定this的值。需要说明它们的区别,比如call和apply立即执行,而bind返回新函数。 箭头函数的情况比较特殊,它们的this在定义时确定,继承自外层作用域,不能通过call或apply改变。这里要强调箭头函数与传统函数在this处理上的不同,避免用户混淆。另外,事件处理函数中的this通常指向触发事件的元素,比如DOM事件中的this是触发事件的DOM节点。 还需要注意回调函数中的this可能丢失绑定,比如在setTimeout中使用对象方法时,this可能指向全局对象,这时候可以用箭头函数或者bind来保持正确的this。最后,可能存在的误区,比如认为this指向函数自身或函数的作用域,需要澄清这些常见错误理解。 在组织内容时,要结构清晰,每个情况用标题分开,给出示例代码,并解释结果。同时提醒用户严格模式的影响,以及箭头函数不能作为构造函数使用的情况。确保用简单的中文表达,避免技术术语过多,必要时举例帮助理解。最后总结不同情况,帮助用户记忆和区分。</think>函数的 `this` 指向问题是 JavaScript 中的核心概念之一。它的指向取决于函数被调用的方式,而不是定义的位置。以下是逐步分析: --- ### 一、默认绑定(普通函数调用) 当函数独立调用时(非对象方法、非事件回调等),**非严格模式**下 `this`` 指向全局对象: ```javascript function show() { console.log(this); // 浏览器中指向 window,Node.js指向 global } show(); ``` **严格模式**下(`'use strict'`)会变为 `undefined`: ```javascript 'use strict'; function show() { console.log(this); // undefined } show(); ``` --- ### 二、隐式绑定(对象方法调用) 当函数作为对象的方法调用时,`this` 指向调用它的对象: ```javascript const obj = { name: 'Alice', greet: function() { console.log(this.name); // 输出 'Alice' } }; obj.greet(); // 通过对象调用方法 ``` --- ### 三、显式绑定(call/apply/bind) 通过 `call`、`apply` 或 `bind` 强制指定 `this`: ```javascript function sayHi() { console.log(this.name); } const person = { name: 'Bob' }; sayHi.call(person); // 输出 'Bob'(立即执行) sayHi.apply(person); // 同上 const boundFunc = sayHi.bind(person); // 返回新函数 boundFunc(); // 输出 'Bob' ``` --- ### 四、构造函数绑定(new 关键字) 使用 `new` 调用构造函数时,`this` 指向新创建的实例: ```javascript function Person(name) { this.name = name; // this 指向新对象 } const alice = new Person('Alice'); console.log(alice.name); // 输出 'Alice' ``` --- ### 五、箭头函数(Lexical this) 箭头函数没有自己的 `this`,它会继承外层作用域的 `this`: ```javascript const obj = { name: 'Charlie', greet: () => { console.log(this.name); // 输出 undefined(此处外层是全局) }, greetNormal: function() { const inner = () => { console.log(this.name); // 输出 'Charlie' }; inner(); } }; obj.greet(); obj.greetNormal(); ``` --- ### 六、事件处理函数 在 DOM 事件监听中,`this` 指向触发事件的元素: ```javascript button.addEventListener('click', function() { console.log(this); // 指向被点击的 button 元素 }); ``` --- ### 总结表格 | 调用方式 | `this` 指向 | |----------------------|--------------------------------------| | 普通函数调用 | 全局对象(严格模式为 `undefined`) | | 对象方法调用 | 调用方法的对象 | | `call`/`apply`/`bind`| 显式指定的对象 | | `new` 构造函数 | 新创建的实例对象 | | 箭头函数 | 继承外层作用域的 `this` | | 事件处理函数 | 触发事件的 DOM 元素 | 理解这些规则后,可以通过调试工具(如 `console.log(this)`)验证具体场景中的指向
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值