JS 中 this 关键字

简介: 关键字this是什么?**用来表示一个上下文对象,用于“传递” 一个对象的引用。**观察以下例子,可以发现 add函数需要传递对象当作参数,而addNo函数仅需绑定对象,然后通过使用this就可以访问到对象内的属性。add函数这种显示传递上下文对象在复杂的模式中,也会导致混乱,反而使用this则不会这样。

关键字this是什么?

用来表示一个上下文对象,用于“传递” 一个对象的引用。

观察以下例子,可以发现 add函数需要传递对象当作参数,而addNo函数仅需绑定对象,然后通过使用this就可以访问到对象内的属性。add函数这种显示传递上下文对象在复杂的模式中,也会导致混乱,反而使用this则不会这样。

function add(context) {
console.log(context.numA + context.numB);

}
function addNo(){

console.log(this.numA+this.numB)
}
var obj = {
    numA: 1,
    numB: 3
}

add(obj); // 4
addNo.call(obj); // 4

使用this时经常需要判断this是指向谁,经常有2个误解

1、误解一:指向自身this是否是指向函数本身呢?

我们可以从demo中找答案

function foo(i) {
console.log(`当前是:${i}`)
this.count++;
};

foo.count = 0;

(function main() {

for (let index = 0; index < 5; index++) {
        foo(index);
}
})();
console.log(`count的值:${foo.count}`);

//运行得到的结果
当前是:0
当前是:1
当前是:2
当前是:3
当前是:4
count的值:0

Count的值是0,而不是5,因为执行道foo.count时是给函数对象foo增加了count属性,但是在for循环中执行foo(index),所指向的函数对象foo不是同一个;那怎么样才能让其指向同一个呢?

  • 方法1:this.count++修改成foo.count++ 让其显示替代this来引用函数对象
  • 方法2:foo(index)修改成foo.call(foo,index) ,通过绑定方式,强制让this指向函数对象foo

2、误解2:this指向函数的作用域

this在任何情况下都不指向函数的词法作用域

this到底指向谁?

This在运行时才进行绑定,所以在定义时this对指向谁是未知的,只有在运行时才能确认指向谁,且实际上this最终指向的是那个调用它的对象。

判断this,可以根据优先级来判断:

  • 1、函数是在new中调用,是==this绑定的是新创建的对象 var foobj = new foo()
  • 2、函数是通过call,apply(显示绑定)或硬绑定调用,是==this绑定的是指定的对象:var bar = foo.call(obj)
  • 3、函数是否在某个上下文对象中调用(隐式绑定),是==》this绑定的是那个上下文对象 var bar = boj1.foo()
  • 4、如果都不是,则使用默认绑定,严格模式(use strict)下绑定到undefined,否则绑定到全局对象

注意如果这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象

目录
相关文章
|
3月前
|
JavaScript 前端开发 开发者
JavaScript中的const关键字解析
JavaScript中的const关键字解析
|
3月前
|
JavaScript 前端开发
JavaScript变量命名规则及关键字详解
JavaScript变量命名规则及关键字详解
|
3月前
|
自然语言处理 JavaScript 前端开发
在JavaScript中,this关键字的行为可能会因函数的调用方式而异
【6月更文挑战第15天】JavaScript的`this`根据调用方式变化:非严格模式下直接调用时指向全局对象(浏览器为window),严格模式下为undefined。作为对象方法时,`this`指对象本身。用`new`调用构造函数时,`this`指新实例。`call`,`apply`,`bind`可显式设定`this`值。箭头函数和绑定方法有助于管理复杂场景中的`this`行为。
53 3
|
2月前
|
JavaScript
js 【详解】函数中的 this 指向
js 【详解】函数中的 this 指向
28 0
|
2月前
|
JavaScript 前端开发
|
3月前
|
JavaScript 前端开发 C++
JavaScript中的let关键字详解
JavaScript中的let关键字详解
|
3月前
|
JavaScript
js -- 函数总结篇,函数提升、动态参数、剩余参数、箭头函数、this指向......
js -- 函数总结篇,函数提升、动态参数、剩余参数、箭头函数、this指向......
|
4月前
|
JavaScript 前端开发
js中改变this指向、动态指定函数 this 值的方法
js中改变this指向、动态指定函数 this 值的方法
|
3月前
|
JavaScript 前端开发
JS中如何使用this方法
JS中如何使用this方法
14 0
|
4月前
|
自然语言处理 JavaScript 前端开发
在JavaScript中,this关键字的行为可能会因函数的调用方式而异
【5月更文挑战第9天】JavaScript中的`this`关键字行为取决于函数调用方式。在非严格模式下,直接调用函数时`this`指全局对象,严格模式下为`undefined`。作为对象方法调用时,`this`指向该对象。用`new`调用构造函数时,`this`指向新实例。通过`call`、`apply`、`bind`可手动设置`this`值。在回调和事件处理中,`this`可能不直观,箭头函数和绑定方法可帮助管理`this`的行为。
35 1