首页 > 其他分享 >js的this指向

js的this指向

时间:2023-12-27 14:46:15浏览次数:33  
标签:function console log 指向 js const 函数

在JavaScript中,this 是一个特殊的变量,它引用了调用对象。它的指向在不同的上下文中有不同的变化。以下是一些常见的 this 指向的情况:

1.全局上下文:在全局作用域中,this 指向全局对象。在浏览器中,这通常是 window 对象。

console.log(this); // window (在浏览器中)

2.函数调用:当一个函数被调用时,this 通常指向全局对象。但如果你在一个对象的方法内部调用该方法,那么 this 指向该对象。

function myFunction() {  
  console.log(this);  
}  
  
myFunction(); // window (在浏览器中)  
  
const myObject = {  
  myMethod: function() {  
    console.log(this);  
  }  
};  
  
myObject.myMethod(); // myObject

3.构造函数:当一个函数被用作构造函数(通过 new 关键字)时,this 指向新创建的对象。

function MyConstructor() {  
  this.property = 'value';  
  console.log(this); // 新创建的对象  
}  
  
const myInstance = new MyConstructor(); // { property: 'value' }

4.事件监听器:在事件监听器中,this 通常指向被触发事件的元素。

button.addEventListener('click', function() { console.log(this); // 触发事件的按钮元素 });

button.addEventListener('click', function() {  
  console.log(this); // 触发事件的按钮元素  
});

5.箭头函数:箭头函数不会创建自己的 this 上下文,所以它继承自包围它的函数的 this 值。这意味着如果你在一个对象的方法中使用箭头函数,那么 this 将指向该对象。

const myObject = {  
  myMethod: function() {  
    const arrowFunction = () => {  
      console.log(this); // myObject,而不是全局对象或事件元素等。  
    };  
    arrowFunction();  
  }  
};

6.绑定和call/apply/bind:你可以使用 Function.prototype.bindcallapplyFunction.prototype.bind() 方法来明确地设置函数的 this 值。这允许你选择函数运行时的上下文。例如:

function myFunction() {  
  console.log(this);   
}  
  
const boundFunction = myFunction.bind({ property: 'value' }); // 绑定到特定对象上  
boundFunction(); // { property: 'value' },而不是全局对象或其他。

7.一个箭头函数(外层函数)内部还有另一个箭头函数,那么内部函数的this值将继承自外部函数。这意味着内部函数的this值将指向外部函数的上下文。

const outerObject = {  
  property: 'outer',  
  method: function() {  
    const innerFunction = () => {  
      console.log(this.property); // 继承自外部函数的上下文  
    };  
    innerFunction();  
  }  
};  
  
outerObject.method(); // 输出 "outer"

在上面的示例中,method是一个对象的方法,它包含一个箭头函数innerFunction。当innerFunction被调用时,它的this值将继承自method函数,即指向outerObject。因此,通过this.property访问的是outerObject的属性,输出为"outer"。

 

标签:function,console,log,指向,js,const,函数
From: https://www.cnblogs.com/shyhuahua/p/17930504.html

相关文章

  • JS 日期与毫秒之间互相转换
    时间戳(Unix/Linuxtimestamp)转换工具—在线转换毫秒时间戳工具(toolscat.com) Date()函数:该方法返回日期的毫秒表示(毫秒数精确到毫秒)1.毫秒转日期://2023-3-25格式newDate(1679673600000).toLocaleDateString().replace(/\//g,"-");//2023-03-25格式newDate(1......
  • permission.js 主要是对权限管理进行分析
    //引入路由importrouterfrom'./router'//引入仓库importstorefrom'./store'//引入ElementUI中的提示组件messageimport{Message}from'element-ui'//引入nprogress进度条importNProgressfrom'nprogress'//progressbarimport......
  • router下的 index.js 对路由进行分析
    //引入vueimportVuefrom'vue'//引入vue-routerimportRouterfrom'vue-router'//路由就是一个插件需要useVue.use(Router)//引入layout组件很重要//一级路由出口匹配layout组件/*Layout*/importLayoutfrom'@/layout'/*RouterModules*///引入其......
  • store下的 moudles 下的 permssion.js文件 主要是对路由规则的生成进行解释
    import{asyncRoutes,constantRoutes}from'@/router'/***Usemeta.roletodetermineifthecurrentuserhaspermission*@paramroles*@paramroute*/functionhasPermission(roles,route){//如果route.meta规则中有metameta中有roles选项......
  • js一道try...catch的面试题
    说到try...catch都觉得非常熟悉了,不就是用来捕捉代码块中的错误嘛,平时也用得比较多的。然而因为了解不够多,我的面试却栽在了一个简单的知识点上:try...catch只能捕捉到同步执行代码块中的错误。题目是:以下代码有错吗?如果有错,应该如何改正?try{setTimeout(()=>{thrown......
  • 关于autojs
    1、官方文档:http://doc.autoxjs.com/2、vscode的安装使用:https://blog.csdn.net/tfnmdmx/article/details/1239848083、vscode的智能提示:https://blog.csdn.net/zz00008888/article/details/133771057已实现的热更新方案:1、将gitlab可以设置为公开访问,通过http下载压缩包,解压......
  • jmeter的json提取器多个取值的取法&ForEach控制器对多取值变量进行循环调用
    1、jmeter的json提取器多个取值的取法userId有多个值 $.responseData.datas[*].userId-1代表取所有的值  2、ForEach控制器对多取值变量进行循环调用 --实现多取值变量进行循环调用${userId_matchNr} ---代表存储变量的长度  3、循环控制器--实现id自增 ......
  • 【力扣】-15. 三数之和|刷题打卡-JS
    给你一个整数数组 nums ,判断是否存在三元组 [nums[i],nums[j],nums[k]] 满足 i!=j、i!=k 且 j!=k ,同时还满足 nums[i]+nums[j]+nums[k]==0 。请你返回所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例1:输入:nums=[-1,0,1,2,-1,-4......
  • Node.js+Express+Koa2开发接口学习笔记(三)
    数据库操作(创建和增删查)使用Navicat快速创建myblog数据库创建表使用navicat快速建表使用sql语句进行简单的查询--showtables;--显示该数据库中的所有表INSERTINTOusers(username,`password`,realname)VALUES('zhangsan','123','张三')INSERTINTOusers(......
  • Python+Selenium4自动化之JS属性
     应用场景在自动化中,能对JS代码进行增、删、改的话,可以帮助我们解决很多问题,如:修改<a>标签的target属性,让它不打开新的窗口(_blank),从而不用频繁使用switch_to进行窗口之间的切换。如:日期的输入框被锁定无法直接输入,需要点开日历控件后,从日历控件上点击日期,这时就可以删除......