this指向问题

1.全局上下文

如果你在非严格模式("use strict"下直接在全局作用域中调用一个函数,this 将指向全局对象(在浏览器中通常是 window)。

function myFunction() {  
    console.log(this === window); // true  
}  
myFunction();

2.严格模式("use strict"

在严格模式下,全局上下文中的 this 不再指向 window,而是 undefined(除非它在函数内部被调用,那么 this 的值将取决于如何调用该函数)。

3.对象方法

当函数作为对象的方法被调用时,this 将指向该对象。

谁调用就指向谁

var myObject = {  
    property: 'Hello',  
    myMethod: function() {  
        console.log(this.property); // 输出 'Hello'  
    }  
};  
myObject.myMethod();

4.构造函数

当使用 new 关键字调用函数时,该函数会作为构造函数,并且 this 会被绑定到新创建的对象实例上。

function MyConstructor() {  
    this.property = 'Hello';  
}  
var obj = new MyConstructor();  
console.log(obj.property); // 输出 'Hello'

 

5.显式设置

你可以使用 callapply 或 bind 方法来显式设置 this 的值。

1.call 方法

call 方法调用一个具有给定 this 值和作为单独参数提供的参数的函数。

function.call(thisArg, arg1, arg2, ...)

function greet(greeting, punctuation) {  
  return greeting + ', ' + this.name + punctuation;  
}  
  
const obj = { name: 'World' };  
  
console.log(greet.call(obj, 'Hello', '!')); // 输出 "Hello, World!"
2.apply 方法

apply 方法调用一个具有给定 this 值和作为数组(或类似数组对象)提供的参数的函数。

function.apply(thisArg, [argsArray])
 

function greet(greeting, punctuation) {  
  return greeting + ', ' + this.name + punctuation;  
}  
  
const obj = { name: 'World' };  
const args = ['Hello', '!'];  
  
console.log(greet.apply(obj, args)); // 输出 "Hello, World!"
3.bind 方法

bind 方法创建一个新的函数,当被调用时,它的 this 关键字将设置为提供的值,在调用新函数时,将给定参数列表作为原函数的参数序列的前置参数。

注意,bind 方法返回一个新的函数,并不会立即执行原函数。而 call 和 apply 则会立即执行原函数

function.bind(thisArg[, arg1[, arg2[, ...]]])
 

function greet(greeting, punctuation) {  
  return greeting + ', ' + this.name + punctuation;  
}  
  
const obj = { name: 'World' };  
const boundGreet = greet.bind(obj, 'Hello');  
  
console.log(boundGreet('!')); // 输出 "Hello, World!"

 

6.箭头函数

箭头函数不会绑定自己的 this 值,它会捕获其所在上下文的 this 值作为自己的 this 值。这意味着在箭头函数中,this 指向定义它的函数或全局对象(取决于箭头函数是在哪里定义的)。

箭头函数中的this与普通函数完全不同,也不受调用方式的影响,事实上箭头函数中并不存在this !

        1.箭头函数会默认帮我们绑定外层this的值,所以在箭头函数中this 的值和外层的this是一样的

        2.箭头函数中的this引用的就是最近作用域中的this

        3.向外层作用域中,一层一层查找this,直到有this的定义

注意

1.在开发中[使用箭头函数前需要考虑函数中this 的值],事件回调函数使用箭头函数时,this 为全局的window因此DOM事件回调函数如梁里面需要DOM对象的this,则不推荐使用箭头函数

2.同样由于箭头函数this的原因,基于原型的面向对象也不推荐采用箭头函数
 

var obj = {  
    property: 'Hello',  
    myMethod: function() {  
        setTimeout(() => {  
            console.log(this.property); // 输出 'Hello',因为箭头函数捕获了外部的 this  
        }, 0);  
    }  
};  
obj.myMethod();

 

7.事件监听器

在DOM事件监听器中,this 通常指向触发该事件的元素。

document.getElementById('myButton').addEventListener('click', function() {  
    console.log(this); // 输出触发点击事件的按钮元素  
});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值