this的指向总结

本文详细讲解了JavaScript中this的指向规则,包括普通函数、对象函数、构造函数、事件绑定、定时器函数、立即执行函数以及箭头函数的情况,并通过实例展示了如何使用apply, call, bind()改变函数的this指向。此外,还涵盖了在不同上下文中this的查找机制,帮助理解JavaScript中this的复杂行为。

总结前置:
1、普通函数:this指向window
2、对象函数:this指向调用它的对象
3、构造函数:没有return时,this指向调用它的对象,有return时,指向return返回的对象
4、绑定事件函数:this指向函数的调用者
5、定时器函数:this指向window
6、立即执行函数:this指向window
7、箭头函数:箭头函数没有this,只能向外层寻找,指向箭头函数被定义时所在的作用域。
8、使用apply,call,bind()可以更改函数this的指向。
使用方法:如

函数名.apply(对象);

使函数的this指向该对象。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>笔记:this的指向</title>
</head>
<body>

    <button id="btn">点击我</button>

    <script>
        // 1、普通函数:指向window
        function f1(){
            console.log(this);//Window

        }
        f1();

        // 2、对象函数:指向调用他的对象
        var obj={
            sayhi:function(){
                console.log(this);//{sayhi: ƒ}
            }
        }
        obj.sayhi();

        //3、构造函数
        function Star(name,age){
            this.name=name;
            this.age=age;
            console.log(this);//没有return函数,指向调用他的对象
        }
        let p1=new Star('李峋',20);

        function Star1(name,age){
            this.name=name;
            this.age=age;
            let p={name:'朱韵'};
            return p;//有return,指向返回的对象
        }
        let p11=new Star1('李峋',20);
        console.log(p11);

        //4、绑定事件函数:指向函数的调用者
        var btn = document.querySelector('button');
        btn.onclick = function () {
            console.log(this);  //<button id="btn">点击我</button>
        }

        //5、定时器函数:指向window
        setTimeout(function(){
            console.log(this);
        },1000);

        //6、立即执行函数:指向window
        (function(a){
            console.log(this);
        })(1);

        //7、箭头函数:箭头函数没有this,只能向外层寻找,指向函数被定义时所在的作用域。
        //自定义箭头函数
        let t=()=>{
            console.log(this);//打印window
        };
        t();//注意加括号

        //箭头函数作为对象方法时
        let t1={
            name:()=>{
                console.log(this);//由于对象也没有this,再次向外寻找,打印window
            }
        };
        t1.name();

        //8、显示绑定:函数通过call,apply,bind方法绑定,this指向的就是指定的对象
        function fun(){
            console.log(this.age);
        }
        var person={age:20,fun};
        var person2={age:18,fun};

        var age=28;
        fun();//28,this指向window
        person.fun();//20,指向person,此处为隐式绑定

        fun.call(person);//20,此时函数fun的this指向person,与第84行代码做对比
        fun.apply(person2);//18,此时函数fun的this指向person2
        fun.bind(person)();//20,此时函数fun的this又被绑定到了person上

        
        

    </script>
</body>
</html>

借鉴:

<think>好的,我现在需要帮助用户理解JavaScript中的this指向规则。用户已经提供了一些引用资料,我得仔细看看这些资料,然后整理出一个清晰的解释。 首先,引用[1]提到在严格模式下,普通函数调用时this是undefined,比如示例中的show()输出undefined。这说明严格模式会影响this指向。引用[3]则详细说明了方法调用和函数调用的区别,特别是当方法被赋值给变量后,this会丢失原来的指向,在非严格模式下指向全局对象,严格模式下是undefined。这点很重要,需要强调不同调用方式的影响。 引用[4]指出this的动态绑定特性,不是在定义时确定,而是在调用时决定的。这意味着同一个函数在不同调用方式下this可能不同,比如作为方法调用还是作为普通函数调用。同时,引用[2]强调了正确理解this对代码行为的重要性,需要提供应用示例来帮助用户理解。 接下来,我需要按照用户的要求,将回答结构化,分点解释this指向规则,并给出示例。同时,必须遵循系统级指令,行内数学表达式用$...$,但这可能用不上数学公式,主要是代码示例。独立公式可能也不需要,但代码块需要用正确的格式,比如Python的代码块用三个反引号加python。不过用户的问题是关于JavaScript的,所以示例代码应该是JavaScript的,用正确的语法。 需要确保每个规则都清晰,每个示例都能准确说明情况。比如,默认绑定、隐式绑定、显式绑定(call/apply/bind)、new绑定、箭头函数等。同时,要提到严格模式和非严格模式下的差异,特别是默认绑定的不同行为。 然后生成相关问题,可能需要考虑用户可能的后续疑问,比如this在事件处理函数中的指向,或者如何避免this丢失的问题,箭头函数和普通函数的区别,以及如何强制改变this指向等。 在整理过程中,要检查引用资料,确保每个引用的内容都正确对应到解释中的部分,并自然地在末尾添加引用标识。例如,当提到严格模式下的默认绑定时,引用[1]和[3]的相关部分需要标注。 最后,确保回答符合用户的要求:结构清晰,逐步解决问题,真实可靠,使用中文,正确使用LaTeX格式(虽然可能这用到的LaTeX不多,但如果有变量或代码内联,可能需要使用$...$,不过代码示例应该用代码块)。同时,用户提供的引用要正确标注,比如[^1]、[^2]等。 现在开始组织内容,分点解释规则,每个规则下给出示例,并标注对应的引用来源。确保示例代码正确,比如函数调用、方法调用、箭头函数等。注意严格模式和非严格模式的区别,特别是在默认绑定中的不同表现。同时,显式绑定部分要说明call、apply、bind的使用,以及new操作符如何影响this。箭头函数的特殊性也需要强调,它们没有自己的this,而是继承外层作用域。 生成的相关问题需要覆盖常见的疑问点,比如不同调用方式的影响、严格模式的作用、箭头函数的应用、如何避免this问题等。这样用户可以有进一步的学习方向。</think>### JavaScript中`this`指向规则详解 `this`是JavaScript中动态绑定的关键字,其指向**取决于函数调用时的上下文**,而非定义时的位置[^4]。以下是其核心规则及示例: --- #### 一、默认绑定规则 1. **非严格模式**:独立函数调用时,`this`指向全局对象(浏览器中为`window`)。 ```javascript function show() { console.log(this); } show(); // 输出:window ``` 2. **严格模式**:独立函数调用时,`this`为`undefined`[^1]。 ```javascript 'use strict'; function show() { console.log(this); } show(); // 输出:undefined ``` --- #### 二、隐式绑定规则 当函数作为**对象方法**调用时,`this`指向调用该方法的对象。 ```javascript const user = { name: 'Alice', greet() { console.log(this.name); } }; user.greet(); // 输出:"Alice" ``` ⚠️ 注意:若将方法赋值给变量后调用,会丢失原`this`指向[^3]: ```javascript const greetFunc = user.greet; greetFunc(); // 非严格模式下输出:undefined(全局对象无name属性) ``` --- #### 三、显式绑定规则 通过`call`、`apply`或`bind`强制指定`this`指向。 ```javascript function logName() { console.log(this.name); } const obj = { name: 'Bob' }; logName.call(obj); // 输出:"Bob" logName.apply(obj); // 同上 const boundFunc = logName.bind(obj); boundFunc(); // 输出:"Bob" ``` --- #### 四、`new`操作符绑定 构造函数中的`this`指向新创建的实例。 ```javascript function Person(name) { this.name = name; } const alice = new Person('Alice'); console.log(alice.name); // 输出:"Alice" ``` --- #### 五、箭头函数规则 箭头函数**无自身`this`**,继承外层作用域的`this`值。 ```javascript const timer = { start() { setTimeout(() => { console.log(this); // 指向timer对象 }, 1000); } }; timer.start(); ``` --- ### 总结对比表 | 场景 | `this`指向 | 示例 | |--------------------|----------------------------------|------------------------------| | 默认绑定(非严格) | 全局对象(如`window`) | `show()` → `window` | | 默认绑定(严格) | `undefined` | `show()` → `undefined` | | 方法调用 | 调用该方法的对象 | `user.greet()` → `user` | | 显式绑定 | `call`/`apply`/`bind`指定的对象 | `logName.call(obj)` → `obj` | | `new`绑定 | 新创建的实例对象 | `new Person()` → 实例 | | 箭头函数 | 外层作用域的`this` | 继承外层上下文[^4] | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值