首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js的this指向

在JavaScript中,this关键字的指向取决于函数的调用方式。以下是this指向的几种常见情况:

基本概念

  1. 全局上下文:在全局执行上下文中(非严格模式下),this指向全局对象,在浏览器中是window对象。
  2. 函数调用:在普通函数调用中(非严格模式下),this指向全局对象;在严格模式下,thisundefined
  3. 方法调用:当函数作为对象的方法被调用时,this指向调用该方法的对象。
  4. 构造函数:当函数用作构造函数(使用new关键字)时,this指向新创建的实例对象。
  5. 事件处理程序:在事件处理程序中,this通常指向触发事件的元素。
  6. 箭头函数:箭头函数没有自己的this绑定,它会捕获其所在上下文的this值。

示例代码

代码语言:txt
复制
// 全局上下文
console.log(this); // 在浏览器中输出: Window

// 函数调用
function regularFunction() {
  console.log(this);
}
regularFunction(); // 在浏览器中输出: Window(非严格模式),undefined(严格模式)

// 方法调用
const obj = {
  method: function() {
    console.log(this);
  }
};
obj.method(); // 输出: obj

// 构造函数
function ConstructorFunction() {
  console.log(this);
}
new ConstructorFunction(); // 输出: ConstructorFunction {}

// 事件处理程序
document.body.addEventListener('click', function() {
  console.log(this); // 输出: body元素
});

// 箭头函数
const arrowFunction = () => {
  console.log(this);
};
arrowFunction(); // 输出: Window(定义时的上下文)

应用场景

  • 对象方法:在对象的方法中使用this来访问对象的属性和其他方法。
  • 构造函数:在构造函数中使用this来初始化新创建的对象的属性。
  • 事件处理:在事件处理程序中使用this来访问触发事件的DOM元素。
  • 回调函数:在某些情况下,使用箭头函数来保持this的正确指向。

常见问题及解决方法

  1. this指向错误:在回调函数或嵌套函数中,this的指向可能会出错。可以使用箭头函数或.bind()方法来显式绑定this
  2. this指向错误:在回调函数或嵌套函数中,this的指向可能会出错。可以使用箭头函数或.bind()方法来显式绑定this
  3. 严格模式下的this:在严格模式下,普通函数调用中的thisundefined,需要注意避免错误。
  4. 严格模式下的this:在严格模式下,普通函数调用中的thisundefined,需要注意避免错误。

通过理解this的工作原理和不同调用方式下的行为,可以更有效地编写和调试JavaScript代码。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JS中this的指向

JS中this的指向 this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象。...实例 定义函数与对象并调用,注意只有调用函数才会使this指向调用者,但箭头函数除外。...(this); } }, t5: function(){ // 测试函数调用时箭头函数的this的指向,其指向了上一层对象的调用者 return {...,我们调用同一个方法,但是得到的this是不同的,要注意实际上this的最终指向的是那个调用它的对象 var s1 = { t1: function(){ console.log...由此,this指向了window 改变this指向 使用 apply、call、bind可以改变this的指向,可以参考 https://github.com/WindrunnerMax/EveryDay

1.9K20
  • JS中的this指向问题

    this指向问题 this应该是第一个让人对JavaScript困惑的问题了,但是实际上它的原理非常简单:函数的this在运行时绑定。 什么叫运行时绑定?...就是函数的this和你写在哪里无关,而是和谁调用它有关。谁调用这个函数,this就指向谁。 你现在大概会在想:原来这么简单,我精通了!...先问自己:谁调用的它?你应该一下看不出来,这明明就是直接调的啊!可能有的基础比较扎实的人会说是window,那真是非常的恭喜你了,但你要注意的是以上代码在严格模式下是undefined。...正解:brother call / bind / apply 此为3种干预this指向的操作,限于篇幅不展开讲。...箭头函数 箭头函数可以让你省很多事,因为它的this一般来说都是符合你的直觉的:它的this就是定义时候的this。

    95830

    js中关于this指向的训练题

    this指向是js开发中必须掌握的知识,今天我们就用一道题目来看看你的基础。 ? 各位认为会输出什么呢?请大家先思考不要直接去运行看答案。 实际上会输出:5和2。...(1):第一行fn(),这个毫无疑问,this指向的是window,所以length自然输出5,大家不要看到fn()在obj对象里面调用,就把this认为指向了obj,这是非常错误的; this指向谁,...是在于函数执行时的环境对象,fn()在执行时,他的环境对象依然是window,这里的fn()大家可以理解为window.fn(),是这样进行执行的。...所以,这里大家可以理解为:arguments[0]()=arguments.fn(); this对象就是指向了arguments,length也自然是2了。...大家明白了吗,这道题对于this指向还是比较经典的题目,如果这道题可以独立做出来,证明this指向这块,你基本上是过关的。

    81210

    关于JS中this指向问题的探究

    写在前面 本篇文章的所有例子来源都是《JS设计模式与开发实践》这本书,写这篇文章之前也去查阅了很多关于this指向问题的探讨,包括但不仅仅有像阮一峰老师,还有很多的博主的帖子,还是决定写这篇文章有以下几个原因...,第一,加深自己的理解,重新理一遍关于这方面的知识,第二,我尽可能的使用通俗简单的说辞进行解释 力求让更多的人明白这个东西,第三,this是js中的一个关键字,很有必要单独拿出来写一篇文章。...js中的this this js中的this总是指向一个对象,也就是一个obj,但是具体指向的是哪一个obj是根据具体的运行时函数的执行环境动态绑定的,而不是函数被声明的环境!...,也就是我们常见的普通函数使用的时候,此时的this其实指向的是当前的全局对象,也就是windows,因为在js中全局对象就是windows window.name = "globalName...JS中很多别的不好理解的概念差不多,用的多了就明白了为什么那么写,很多的时候我们看到一个错,就知道需要使用let that = this类似这样的代码块解决,究其原因是他很理解错误的原因吗?

    1.4K31

    面试官问:JS的this指向

    1.面试官问:能否模拟实现JS的new操作符 2.面试官问:能否模拟实现JS的bind方法 3.面试官问:能否模拟实现JS的call和apply方法 4.面试官问:JS的this指向 5.面试官问:JS...的继承 面试官出很多考题,基本都会变着方式来考察this指向,看候选人对JS基础知识是否扎实。...之前写过一篇文章:面试官问:能否模拟实现JS的call和apply方法就是利用对象上的函数this指向这个对象,来模拟实现call和apply的。感兴趣的读者思考如何实现,再去看看笔者的实现。...返回值返回由指定的this值和初始化参数改造的原函数拷贝。 之前也写过一篇文章:面试官问:能否模拟实现JS的bind方法就是利用call和apply指向这个thisArg参数,来模拟实现bind的。...之前也写了一篇文章面试官问:能否模拟实现JS的new操作符,是使用apply来把this指向到生成的新生成的对象上。感兴趣的读者思考如何实现,再去看看笔者的实现。

    76720

    一文读懂Js中的this指向

    对象的方法中如果对象的方法里面包含this,this的指向就是方法运行时所在的对象。该方法赋值给另一个对象,就会改变this的指向。但是,这条规则很不容易把握。请看下面的代码。...,该方法内部的this不是指向a,而是指向a.b,因为实际执行的是下面的代码。...原因跟上一段的多层this是一样的,就是内层的this不指向外部,而指向顶层对象。解决这个问题的一种方法,就是前面提到的,使用中间变量固定this。...:通过bind改变call的指向,指向bind。...也就是f调用了bind函数,结果返回一个指向o的f函数。然后再加括号执行bind(f,o)(),就等于执行了指向o的f函数。最后打印结果的this指向o,因此打印出123。

    93800

    JS数据类型、数组、this指向复习

    ,删除和替换 删除:splice(要删除的起始下标,删除数量) 添加:arr.splice(要插入的起始位置,0,要添加的值) arr.splice(2,0,'全栈1909A'...) 替换:arr.splice(要替换的志起始位置,替换的数量,替换的值) arr.splice(4,2,'我要去阿里') 数组内置的遍历方法: forEach()...也称伪数组 LikeArray,只能通过length获取数量,和通过下标指定具体的某个元素,但不能使用数组的API方法 类数组的使用场景:获取的dom集合,arguments,… – 如何将类数组转换为数组...Math.min.apply(Math,arr) Math.min.call(Math,…arr) Math.max.call(Math,…arr) Math.min() 取小值 五、this指向.../ let _this=this; setTimeout(()=> { console.log(this===btn) },0) } 总结:this通常是谁调用,this指向谁

    1.5K10

    一次搞定js中的this指向

    js中this的指向是在运行时会变动的 这句话严谨的说是有问题的。 this这个关键词,在java中的解释是引用当前类的实例变量。...这种情况的时候,代码的效果就是这样的 function sayThis() { // TODO console.log(this); } this.sayThis(); 复制代码 如果一个函数没有显式的调用者...,那么,这个函数的调用者就是此函数执行的作用域中的this 所以,归根结底,this是当前执行方法的调用者 你以为这样就结束了?...Too young too simple js中还有三个显式绑定this的方法,bind,apply,call当使用这些方法指定执行函数的this时,那this基本上就是指定的了 基本上?...babel编译之后 var _this = this; var sayThis = function () { console.log(_this); }; 复制代码 很容易理解箭头函数中this的指向

    43730

    js中this到底指向什么?

    js中this到底指向什么? 一、前言 前段时间,公司让我改一个界面,我心想改个界面还不简单吗?结果呃,我低估了这颗炸弹的威力。 好吧是我太菜,总结一下,这个this的指向问题。...在js中,this的指向在定义函数的时候是确定不了的,只有在使用这个函数的时候才能确定this的指向。 一般来说在使用时,谁调用的这个函数,函数中的this就指向它。...对象中的函数,在运行时this指向了me这个对象。...在js中,this的指向在定义函数的时候是确定不了的,只有在使用这个函数的时候才能确定this的指向。 这样,我稍微能理解点了,简单的来说就是谁调用的这个函数,函数里面的this就指向谁。...只是将this想指向的对象作为上面函数的参数即可。

    7410

    JS中控制好this关键字的指向

    javascript中的 this 的指向不太好控制,理解不好的话很容易错误 下面几个示例可以加深对this指向的理解 (1)内联事件 <a href="#" onclick="alert(this.tagName...( duang.hi, 1000); setInterval( duang.hi, 1000); 这两种情况都会弹出“我是 全局” 因为setTimeout和setInterval都会改变this的指向为...属性值,而是弹出了button的name属性 说明这种方法会使this指向dom节点本身 如果想this指向duang对象,可以使用匿名函数解决 btn.onclick = function ()...){ duang.hi();}, 1000); setInterval( function (){ duang.hi();}, 1000); 可以看到,这种直接调用和通过匿名函数间接调用 对this的指向影响很大...函数 这时的点击结果为 "I'm 全局",说明this指向了window对象 注意,使用call和apply调用方法时,this的指向会被改为window

    1.4K110
    领券