JavaScript中的this指向哪?

一、引言

this可以说是前端开发中比较常见的一个关键字,由于其指向是在运行时才确定,所以大家在开发中判断其方向时也会很模糊,今天就把this的指向问题拆开了,揉碎了,好好讲一讲。
先来看一个场景,看看该处的 this 应该指向哪:首先在 request.js 中定义一个 getAction 函数

export function getAction(url,parameter) {
  let headers = {}
  if (this && this.realReferer && this.realReferer !== '') {
    headers.realReferer = window.location.origin + this.realReferer
  }
  return axios({
    url: url,
    method: 'get',
    params: parameter,
    headers
  });
}

然后在 test.vue 文件中引用该 getAction函数并使用

import { getAction } from '@api/request'
export default {
  methods: {
    getTableData() {
      getAction(this.url.requestUrl).then(res => {
        //1.这个时候getAction中的this将打印出什么
        //2.在该处打印this,会输出什么
        console.log(this)})
    },
  }
}

现在有两个问题:

  1. test.vue中调用 getAction()时,此时其内部,也就是request.js 中的 this 指向什么?
  2. getAction() then 后的箭头函数中的 this 指向什么?

思考一下能判断出这两个this的指向吗?先卖个管子,等咱们再讲完this的相关原理后再来解答这两个问题。这篇文章会从这几个方面讲解:

  • 什么是this,this和执行上下文的关系
  • this中的默认、隐式、显式和new的绑定规则
  • 箭头函数中的this指向问题

二、什么是this?

this 其实就是一个JavaScript语言中的一个关键字,  它的值是某个对象引用值,其指代的是当前执行上下文中的对象。那么为何需要this?我们先来看看一个例子:

var testObj = {
    name: "testObj",
    print: function () {
        console.log(name)
    }
} 
var name = "global name";
//想通过调用print()来调用testObj中的name
testObj.print();//global name

从结果可知,最后print() 输出"global name", 而不是 testObj 中的 name。为何出现这种情况?
这是因为 JavaScript 语言的作用域链是由词法作用域决定的,而词法作用域是由代码结构来确定的:

  • testObj.print()执行时,这段代码的词法作用域是全局作用域,所以这个时候 js 引擎会去全局作用域中寻找 name,最后打印出“global name”。
  • 因此为了避免这种情况,JavaScript 设计者引入了 this 机制,来调用对象的内部属性,如下代码:
var testObj = {
    name: "testObj",
    print: function () {
        console.log(this.name)
    }
} 
var name = "global name";
testObj.print();//testObj

最后就能够通过testObj.print() 来调用对象内部的属性了。
不同于词法作用域链,this的指向是在运行时才能确定,实际上当执行上下文创建后,会生成一个this引用值,指向当前执行上下文对象,如下图所示:

而 js 引擎在执行代码时的运行时上下文主要有三种:全局执行上下文、函数执行上下文和 eval 执行上下文。不同场景的this指向如下:

//全局执行上下文,当前对象是window
console.log(this);//window
//函数执行上下文外部对象是全局对象,所以指向全局对象window
function test(){
  console.log(this);//window
}
//函数执行上下文外部对象是test,因此指向当前的对象test
var test = {
  test: function(){
    console.log(this);//test{...}对象
  }
}
//eval执行上下文,根据默认绑定规则,指向全局对象window
eval(`console.log(this); `) //window

正是因为this在运行中才得以确定其指向的上下文对象,所以为了规范和标准化this的指向方式,规定了一系列的绑定规则,来决定什么情况下this会绑定到哪个对象。下面就来聊聊this的绑定规则

三、this 绑定规则

this的绑定大致可以划分为默认、隐式、显式和new四种场景下的绑定规则:

1. 默认绑定

当函数被独立调用时,会将this绑定到全局对象。浏览器环境下是window, 严格模式是undefined主要有以下几种场景:

//1. 定义在全局对象下的函数被独立调用
function test(){
    console.log("global:", this);
}
test();//window
//2. 定义在某个对象下的函数被独立调用
var testObj = {
  test: function(){
    console.log("testObj:", this);
  }
}
var testfun = testObj.test;
testfun();//window
//3. 定义在某个函数下的函数被独立调用
function testFun(fn){
    fn();
}
testFun(testObj.test); //window

2. 隐式绑定

当函数作为对象的方法被调用时,隐式绑定规则会将this绑定到调用该方法的对象,也就是"谁调用,就指向谁"。

const obj = {
  name: 'innerObj',
  fn:function(){
    return this.name;
  }
}
//调用者是obj, this指向obj
console.log(obj.fn());//innerObj

const obj2 = {
  name: 'innerObj2',
  fn: function() {
    return obj.fn(); //此时是obj调用fn,所以此时this指向obj
  }
}
//调用者是obj, this指向obj
console.log(obj2.fn())//innerObj

现在我们可以回答引言中的问题1:在request.jsgetAction() 中this指向test.vue 中的全局vue对象,因为import {getAction} from '@api/request' 后,相当于vue对象调用了getAction(),因此其内部的this方向符合隐式绑定规则,所以指向调用者——test.vue 中的全局vue对象

3. 显式绑定

显式绑定主要指通过call、apply和bind方法可以显式地绑定this的值:

call 方法

语法: function.call(thisArg, arg1, arg2, ...) :
参数: thisArg 表示 this 指向的上下文对象, arg1...argn  表示一系列参数
功能:  无返回值立即调用 function 函数

var test = {
}
function test2(){
    console.log(this);
}
//此时是独立函数,因此指向全局对象
test2();//window
//call显式绑定,将函数内部的this绑定至call中指定的引用对象
test2.call(test);//test

apply 方法

语法: function.apply(thisArg, [argsArray]) :
参数: thisArg 表示 this 指向的上下文对象, argsArray  表示参数数组
功能: 没有返回值, 立即调用函数
apply 和 call 的区别在于传参,call 传的是一系列参数,apply 传的是参数数组

var test = {
}
function test2(name){
    console.log(this);
    console.log(name);
}
//此时是独立函数,因此指向全局对象
test2();//window
//call显式绑定,将函数内部的this绑定至call中指定的引用对象
test2.apply(test, ["name"]);//test, name
test2.call(test, "name"); //test

bind 方法

语法:function.bind(thisArg[, arg1[, arg2[, ...]]])
参数: thisArg 表示 this 指向的上下文对象; arg1, arg2, ...表示 要传递给函数的参数。这些参数将按照顺序传递给函数,并在调用函数时作为函数参数使用
功能: 返回原函数 function 的拷贝, 这个拷贝的 this 指向 thisArg

var test = {
    fun: function(){
        console.log(this);
        var test = function(){
            console.log("test", this);
        }
        //1. 因为test.fun()在全局作用域中,所以属于独立函数调用,默认绑定规则指向全局对象
        test(); //window
        //2. bind方法会创建一个原函数的拷贝,并将拷贝中的this指向bind参数中的上下文对象
        var test2 = test.bind(this);
        test2();//test
        //3. apply方法会将this指向参数中的上下文,并立即执行函数
        test.apply(this);//test
        
    }
}
test.fun();

4. new 绑定

主要是在使用构造函数创建对象时,new 绑定规则会将 this 绑定到新创建的实例对象,因此构造函数中用 this 指向的属性值和参数也会被赋给实例对象:

function funtest(){
    this.name = "funtest"
}
var tete = new funtest();
console.log(tete.name); //"funtest"

new 操作符实际上的操作步骤:

  • 创建一个新的对象 {}
  • 将构造函数中的 this 指向这个新创建的对象
  • 为这个新对象添加属性、方法等
  • 返回这个新对象

等价于如下代码:

var obj = {}
obj._proto_ = funtest.prototype
funtest.call(obj)

5. 绑定规则的优先级

上述的绑定规则有时会一起出现,因此需要判断不同规则之间的优先级,然后再来确定其 this 指向:
a. 首先是默认绑定和隐式绑定,执行以下代码:

function testFun(){
    console.log(this);
}
var testobj = {
    name:"testobj",
    fun:testFun
}
//若输出window,则证明优先级默认绑定大于隐式绑定;
//若输出testobj,则证明优先级隐式绑定大于默认绑定;
testobj.fun()//testobj

输出为 testobj 对象,所以隐式绑定的优先级高于默认绑定
b. 下面来看一下隐式绑定和显式绑定,执行以下代码:

function testFun(){
    console.log(this);
}
var testobj = {
    name:"testobj",
    fun:testFun
}
//若输出testobj,则证明优先级隐式绑定大于显式绑定
//若输出{}, 则证明优先级显式绑定大于隐式绑定
testobj.fun.call({})//{}

结果输出 { },说明显式绑定优先级大于隐式绑定
c. 显式绑定的 call, apply,bind 的优先级相同,与先后顺序有关,看以下代码:

function testFun(){
    console.log(this);
}
var testobj = {
    name:"testobj",
    fun:testFun
}
//若输出testobj,则证明优先级隐式绑定大于显式绑定
//若输出{}, 则证明优先级显式绑定大于隐式绑定
testobj.fun.call({})//{}
testobj.fun.call(testobj)

d. 最后来看看显式绑定和 new 绑定的优先级,执行以下代码:

function testFun(){
    console.log(this.name);
}
var testobj = {
    name:"testobj",
}
testFun.call(testobj);//testobj
//new 操作符创建了一个新的对象,并将this重新指向新对象
//覆盖了testFun原来绑定的testobj对象
var instance = new testFun();
console.log(instance.name) //undefined

从结果可知,new 绑定的优先级大于显式绑定
最后总结一下 this 绑定的 优先级是:

fn()(全局环境)(默认绑定)< obj.fn()(隐式绑定) < fn.call(obj)=fn.apply(obj) = fn.bind(obj)(显式绑定)< new fn()

6. 绑定的丢失

有时 this 绑定可能会在某些情况下丢失,导致 this 值的指向变得不确定:

赋值给变量后调用

当使用一个变量作为函数的引用值,并使用变量名执行函数时,会发生绑定丢失,此时 this 会默认绑定到全局对象或变成 undefined(严格模式下)

var lostObj = {
  name: "lostObj",
  fun: function(){
    console.log(this);
	}
}

var lostfun = lostObj.fun;
lostfun();//window
lostObj.fun();//lostObj

从结果发现,lostfun 虽然指向对象中的方法,但是在调用时发生了 this 绑定丢失。因为当赋值给变量时,对象中的 fun就失去了与对象的关联,变成了一个独立函数,所以此时执行 lostfun也就相当于执行独立函数,默认绑定到全局对象。
那如果通过对象来执行呢?看如下代码:

var lostObj = {
  name: "lostObj",
  fun: function(){
    console.log(this);
	}
}
var lostObj2 = {
  name: "lostObj2",
  fun: lostObj.fun
}
var lostfun = lostObj.fun;
lostfun();//window
lostObj.fun();//lostObj
lostObj2.fun();//lostObj2

同样,一旦将方法赋值给变量后,其内部与对象的关联就此丢失,默认绑定到全局对象。但是将变量放到对象中后,就与该对象进行关联。所以该方法执行后的 this 执行了 lostObj2对象。

函数作为参数传递

将函数作为参数传递到新函数中,并在新函数中执行该参数函数:

var lostObj3 = {
  name: "lostObj3",
  fun: function(){
    console.log(this.name);
	}
}
var name = "global"
function doFun(fn){
  fn();
}
doFun(lostObj3.fun);//global

从结果可知,当函数作为参数传递后,其形参 fn 被赋值为 lostObj3.fun。实际上也相当于赋值给变量后调用这种情况,而且 doFun()作为独立函数调用,所以其 this 也就指向全局对象了

回调函数

如果将对象方法作为回调函数传递给其他函数,this 绑定也可能丢失

var lostObj4 = {
  name: 'lostObj4',
  fun: function() {
    setTimeout(function() {
      console.log(`Hello, ${this.name}!`);
    });
  }
};
lostObj4.fun(); // Hello, undefined!

因为 setTimeout 的回调函数最后会以普通函数的形式调用,所以其 this 指向的是全局对象,所以即便是 lostObj4调用 fun(),最后其内部的 this 仍然会丢失。

嵌套函数

当某个函数是嵌套在另一个函数内部的函数时,内部函数中的 this 绑定会丢失,并且会绑定到全局对象或 undefined(严格模式下):

var lostObj5 = {
  name: 'lostObj5',
  fun: function() {
    function innerFun() {
      console.log(`Hello, ${this.name}!`);
    };
    innerFun();
  }
};
lostObj5.fun();// Hello, undefined!

从结果可以发现,嵌套函数 innerFun()中的 this 此时是指向全局环境。所以从这个案例可以说明作用域链和 this 没有关系,作用域链不影响 this 的绑定。
原因是当innerFun()被调用时,是作为普通函数调用,不像 fun()属于对象 lostObj5的内部方法而调用,因此最后其内部的 this 指向全局对象。
其实 this 丢失可以通过箭头函数来解决,下面就来聊聊箭头函数

四、箭头函数中的 this

箭头函数是 ES6 增加的一种编写函数的方法,它用简洁的方式来表达函数
语法:()=>{}
参数:(): 函数的参数,{}: 函数的执行体

1. 箭头函数中的 this 指向

箭头函数中的this是在定义时确定的,它是继承自外层词法作用域。而不是在运行时才确定,如以下代码:

var testObj2 = {
    name: "testObj2", 
    fun: function(){
        setTimeout(()=>{
            console.log(this);
        })
    }
}
var testObj3 = {
    name: "testObj3", 
    fun: function(){
        setTimeout(function(){
            console.log(this);
        })
    }
}
//即使独立调用函数,箭头函数内的this指向是在定义时就已经确定
testObj2.fun();//testObj
testObj3.fun();//window

实际上箭头函数中没有 this 绑定,它是继承自外层作用域的 this 值。因此在许多情况下,箭头函数能解决 this 在运行时函数的绑定问题。

2. 箭头函数与普通函数中的 this 差异

从 上面的例子可以看出箭头函数和普通函数在 this 的处理上存在很大的差异,主要有:

this 绑定方式

普通函数的 this 是在运行时确定的;箭头函数的 this 值是函数定义好后就已经确定,它继承自包含箭头函数的外层作用域

作用域

普通函数是具有动态作用域,其 this 值在运行时基于函数的调用方式动态确定。箭头函数具有词法作用域,其 this 值在定义时就已经确定,并继承外部作用域

绑定 this 的对象

普通函数中 this 可以通过函数的调用方式(如对象方法、构造函数、函数调用等)来绑定到不同的对象,而箭头函数没有自己的 this 绑定;箭头函数没有自己的 this 绑定,它只能继承外部作用域的 this 值,无法在运行时改变绑定对象,而且也无法通过显式绑定来改变 this 的指向。

var testObj4 = {
  arrowFun: ()=>{
    console.log(this);
  },
  normalFun: function(){
    console.log(this);
  }
}
//此时箭头函数的this继承全局上下文的this,显式绑定无法修改箭头函数中的this值
testObj4.arrowFun();//window
testObj4.arrowFun.apply({});//window
testObj4.normalFun();//testObj4
testObj4.normalFun.apply({});//{}

下面我们就可以解答引言中的问题 2 了。箭头函数中的 this 指向其上层的作用域,也就是 getAction() 中的 this 值,而从隐式绑定调用规则,当前是 vue 实例调用 getTableData()然后再调用 getAction(),因此 this 值指向当前 vue 实例。

五、 this 中的面试题

手写实现一个 bind 函数

通过分析 bind 函数的语法和参数来:function.bind(thisArg[, arg1[, arg2[, ...]]])

  • 返回值是一个函数
  • 参数 thisArg 指向

我们暂时不考虑原型问题,实现如下代码:

Function.prototype.mybind = function (thisArg) {
  //1.隐式绑定,当前的this指向目标函数
  var targetFn = this;
  //将参数列表转换为数组,并删除第一个参数
  var args = Array.prototype.slice.call(arguments, 1);
  //2.返回值一个函数
  return function bound() {
     var innerArgs = Array.prototype.slice.call(arguments);
     var finalArgs = args.concat(innerArgs);
    //解决返回函数使用new后,绑定this忽略问题
     var _this = targetFn instanceof this ? this: thisArg;
     return targetFn.apply(thisArg, finalArgs)
   }
 }
}

总结

文章回顾 this 的概念和 this 指向的判断绑定规则,

  1. 首先是绑定规则:
  • 独立函数调用执行时,使用默认绑定规则,this 指向 window
  • 当函数作为对象方法被调用,使用隐式绑定规则,this 指向这个对象
  • 当函数作为构造方法时,使用 new 绑定规则,this 指向返回的对象
  • apply/call/bind 要注意参数的传递和返回值不同
  • 箭头函数要看该箭头函数在哪个作用域下,this 就指向谁
  1. 绑定规则的优先级:

fn()(全局环境)(默认绑定)< obj.fn()(隐式绑定) < fn.call(obj)=fn.apply(obj) = fn.bind(obj)(显式绑定)< new fn()

  1. 此外要注意绑定失效的情况,善用箭头函数来保证 this 的指向稳定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/245346.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

客户互动智能升级:Amazon Connect 引入生成式AI

授权说明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道。 前言&#xff1a; 在数字化时代&#xff0c;客户服务不仅仅是企…

【ET8框架入门】2.ET框架解析

菜单栏相关&#xff1a;ENABLE_DLL选项 ET->ChangeDefine->ADD_ENABLE_DLL/REMOVE_ENABLE_DLL 一般在开发阶段使用Editor时需要关闭ENABLE_DLL选项。该选项关闭时&#xff0c;修改脚本之后&#xff0c;会直接重新编译所有的代码&#xff0c;Editor在运行时会直接使用最…

如何在nacos中的配置在不同的环境服务下可实现配置共享

其实在微服务启动时&#xff0c;会去nacos读取多个配置文件&#xff0c;例如&#xff1a; [spring.application.name].yaml&#xff0c;例如&#xff1a;nacos-order-service.yaml[spring.application.name]-[spring.profiles.active].yaml&#xff0c;例如&#xff1a;nacos-o…

c语言快速排序(霍尔法、挖坑法、双指针法)图文详解

快速排序介绍&#xff1a; 快速排序是一种非常常用的排序方法&#xff0c;它在1962由C. A. R. Hoare&#xff08;霍尔&#xff09;提的一种二叉树结构的交换排序方法&#xff0c;故因此它又被称为霍尔划分&#xff0c;它基于分治的思想&#xff0c;所以整体思路是递归进行的。 …

基于Java+Swing+mysql学生选课成绩信息管理系统

基于JavaSwingmysql学生选课成绩信息管理系统 一、系统介绍二、功能展示三、项目相关3.1 乱码问题3.2 如何将GBK编码系统修改为UTF-8编码的系统&#xff1f; 四、其它1.其他系统实现 五、源码下载 一、系统介绍 学生教师信息管理、年级班级信息管理、课程信息管理、选课、成绩…

vue3+vite4中使用svg,使用iconfont-svg图标

记录一下vue3中如何使用svg图标&#xff0c;vue2中大家常用iconfont字体图标&#xff0c;现在vue3大家都又推荐svg的方式使用图表&#xff0c;包括elementplus组件库也变成使用svg方式引用图标。 1、创建svg组件 components/IconSvg.vue <template><svg class"…

Imagen 2 发布、Gemini Pro 免费体验、代码平台 Duet AI 上线,谷歌大爆发

在上周发布 Gemini 后&#xff0c;本周谷歌又有了新动作。 12 月 13 日&#xff0c;谷歌在其云平台上推出了一系列 AI 模型以供用户体验并实际应用&#xff1a;向开发者和企业开放 Gemini Pro、面向开发者和安全运营的 Duet AI、图像生成 Imagen 2 以及用于医疗保健场景的 Med…

python安装教程(2020最新),python安装详细教程

这篇文章主要介绍了python安装教程(2020最新)&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 1.从python官网下载python的安装包&#xff0c;我用的之前3.7.9的安装包 2.双击打…

成绩分级 C语言xdoj53

问题描述 给出一个百分制的成绩&#xff0c;要求输出成绩等级A,B,C,D,E。90分以上为A&#xff0c;80~89分为B,70~79分为C,60~69分为D&#xff0c;60分以下为E。 输入说明 输入一个正整数m&#xff08;0<m<100&#xff09; 输出说明 输出一个字符 输入样例 …

中兴 H108NS 路由器 tools_admin.asp权限绕过漏洞复现

0x01 产品简介 中兴H108NS路由器是一款集WiFi管理、路由分配、动态获取上网连接等功能于一体的路由器产品。 0x02 漏洞概述 中兴H108NS路由器tools_admin.asp接口处存在身份认证绕过漏洞,攻击者可利用该漏洞绕过身份认证允许访问路由器的管理面板修改管理员密码,获取用户的…

解决msvcr90.dll丢失的方法,3分钟搞定dll丢失问题

众所周知&#xff0c;在电脑操作时&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcr90.dll丢失”。这个问题可能会导致某些程序无法正常运行。本文就将提供五种有效方案来化解这一难题&#xff0c;帮助各位网友迅速恢复程序的运行功能。 一、msvcr90.d…

5.鸿蒙hap可以直接点击包安装吗?

5.鸿蒙hap可以直接点击包安装吗&#xff1f; hap与apk不同&#xff0c;获取的hap不能直接安装 安装方法1&#xff1a; DevEco studio打开项目源文件&#xff0c;打开手机USB调试&#xff0c;DevEco识别到手机后&#xff0c;点击播放按钮安装到手机 https://txwtech.blog.cs…

IIS + Axios 跨域设置

1、服务器端设置IIS &#xff08;web.config) 即可&#xff0c;不需要对django settings.py做配置&#xff08;python manage.py runserver 才需要settings.py配置跨域&#xff0c;IIS在iis上配&#xff09; 网站根目录的web.config中加上这段&#xff1a; <httpProtocol&…

kafka学习笔记--Topic 数据的存储机制

本文内容来自尚硅谷B站公开教学视频&#xff0c;仅做个人总结、学习、复习使用&#xff0c;任何对此文章的引用&#xff0c;应当说明源出处为尚硅谷&#xff0c;不得用于商业用途。 如有侵权、联系速删 视频教程链接&#xff1a;【尚硅谷】Kafka3.x教程&#xff08;从入门到调优…

计算机操作系统-第十六天

目录 线程的实现方式 用户级线程 内核级线程 多线程模型 一对一模型 多对多模型 多对多模型 本节思维导图 线程的实现方式 用户级线程 历史背景&#xff1a;早期操作系统只支持进程&#xff0c;不支持线程&#xff0c;当时的线程是由线程库实现的 本质&#xff1a;从…

【TI毫米波雷达入门-11】毫米波速度相关计算

知识回顾 傅里叶变换 信号用复数表示&#xff0c;A :振幅&#xff0c; Q &#xff1a;相位 中频 信号 中频信号的相位 中频信号的表达公式 频率和相位的表达方式 使用两个Chirp 实现单个目标的测量 两个连续的chirp &#xff0c;检测目标的相位差&#xff0c;通过速度和时间的关…

性能监控体系:InfluxDB Grafana Prometheus

InfluxDB 简介 什么是 InfluxDB &#xff1f; InfluxDB 是一个由 InfluxData 开发的&#xff0c;开源的时序型数据库。它由 Go 语言写成&#xff0c;着力于高性能地查询与存储时序型数据。 InfluxDB 被广泛应用于存储系统的监控数据、IoT 行业的实时数据等场景。 可配合 Te…

Redisson分布式锁原理分析

1.Redisson实现分布式锁 在分布式系统中&#xff0c;涉及到多个实例对同一资源加锁的情况&#xff0c;传统的synchronized、ReentrantLock等单进程加锁的API就不再适用&#xff0c;此时就需要使用分布式锁来保证多服务之间加锁的安全性。 常见的分布式锁的实现方式有&#xff…

MySQL下载、安装、配置详细教程

目录 1 下载 2 安装 2.1执行安装命令&#xff1a; 2.2 编写配置文件 2.3查看默认mysql的密码&#xff1a; 2.4启动mysql服务 2.5 登录mysql&#xff0c;修改密码 3 系统环境变量配置 3.1 配置 3.2 测试 1 下载 官方网址&#xff1a; https://www.mysql.com/跳转到如…

【MATLAB】基于SVMD分解的信号去噪算法(基础版)

代码的使用说明 【MATLAB】基于SVMD去噪的信号去噪算法&#xff08;基础版&#xff09; 代码的原理 1.SVMD原理 连续变分模式分解&#xff08;Successive Variational Mode Decomposition&#xff0c;SVMD&#xff09;是一种用于将混合信号根据其频率特性分离成各个独立分量的…