`
jindw
  • 浏览: 514897 次
  • 性别: Icon_minigender_1
  • 来自: 初到北京
社区版块
存档分类
最新评论

函数申明和变量申明的微妙区别

阅读更多
<script>
var test1 = 1;
function test1(){};//函数申明不能覆盖变量申明?
alert(test1);
</script>
<script>
var test2 = 1;
eval('function test2(){};');
alert(test2);//函数申明怎么又覆盖了变量申明?
</script>
分享到:
评论
48 楼 andot 2007-05-22  
这个其实很简单,看看这篇文章就知道了:http://www.coolcode.cn/andot/javascript-oop-inheritance-polymorphism/255
47 楼 379548695 2007-05-21  
dlee的解释收获不少啊!
46 楼 jianfeng008cn 2007-05-21  
很需要这样的牛在关键点上给我们解解惑啊!
45 楼 hax 2007-05-21  
jindw 写道
hax 写道
dlee 写道
是的,这就是上面我最后补充的一句话的情况:
引用
当然,如果在外部的代码中包含有函数调用,其调用的这个函数是会在调用之前创建的。



你之前的描述是错误的(就ecma规范而言,实际引擎怎么实现,偶们都不清楚)。
根据ecma-262规范edition 3,函数声明(注意var x = function () {}是函数表达式,不是函数声明)会被放到函数体或者代码块的最前端。所以不管外部代码有没有函数调用,都是先创建函数声明所声明的函数(靠,绕口令了)。



我咋没找到呢,记得在那里吗?
我去学习学习。



忘记了。整个ecma规范就是诘屈聱牙,看的人很不爽。找不到也是非常正常的。。。。

我估计在什么execution context之类的章节里。。。
44 楼 hax 2007-05-21  
andot 写道
这两种有差别,

var a = funciton() {}; 是定义一个变量a,定义一个匿名函数,然后将匿名函数赋值给变量a。

而 function a(){} 只是声明一个名字为a的函数。

function a(){} 比 var a = funciton() {}; 执行效率高一点点。但是 var a = funciton() {}; 这种方式更灵活一些。



到目前为之,没有任何理论理由或者实际的测试表明函数声明比函数表达式效率高“一点点”。
43 楼 jindw 2007-05-21  
hax 写道
dlee 写道
是的,这就是上面我最后补充的一句话的情况:
引用
当然,如果在外部的代码中包含有函数调用,其调用的这个函数是会在调用之前创建的。



你之前的描述是错误的(就ecma规范而言,实际引擎怎么实现,偶们都不清楚)。
根据ecma-262规范edition 3,函数声明(注意var x = function () {}是函数表达式,不是函数声明)会被放到函数体或者代码块的最前端。所以不管外部代码有没有函数调用,都是先创建函数声明所声明的函数(靠,绕口令了)。



我咋没找到呢,记得在那里吗?
我去学习学习。
42 楼 hax 2007-05-21  
dlee 写道
可能就是因为这个原因,在很多的Ajax组件库中都采用了使用匿名函数赋值的方法,因为这样做不容易被覆盖。

另外像Dojo这样的库都将全部的函数都放在某个名字空间变量中,例如:
dojo.byId或者dojo.io.bind,
虽然有很多Prototype Fans认为$函数才是最方便优雅的写法,但是dojo.byId用起来会更安全一些,因为开发者定义一个变量名称为dojo.byId是不可能的(变量名中不能出现“.”)。


dojo.byId为什么更安全?其实也不安全,因为dojo这个变量也会被覆盖。只是概率比$小一些罢了。
根本上的解决需要jsi或pies这样的框架。
41 楼 jindw 2007-05-21  
晕,该贴的第四页几乎被hax一头牛给包了^_^
40 楼 hax 2007-05-21  
dlee 写道
to Readonly:
与执行顺序无关。
症状是:只要创建了一个名称为xxx的普通变量,再以最初一楼代码中的那种方式创建名称为xxx的函数就是无效的(并没有创建这个函数),无论将这个函数声明放在哪里。只能通过用匿名函数明确地为xxx变量赋值,才可能绕过这个问题。

这个症状在IE和Firefox中是一致的。


解释就是他们都遵循ecma规范,把函数声明置前,所以被后面的变量声明覆盖了。而匿名函数不是函数声明而是函数表达式,只在执行时才会创建该function对象。
39 楼 hax 2007-05-21  
dlee 写道
呵呵,严格说来,其实现在所有现代高级编程语言都有一个编译的步骤,几乎已经不存在纯粹的解释型语言了。
所以很多未执行的函数中存在代码错误,JavaScript引擎都能够及早报告。如果是解释型语言,是不会有这种行为的。

考虑到JavaScript存在的编译步骤,最初提到的JavaScript代码的这种行为的解释就变得很合理了,因为这些代码并不是逐句解释执行的。



但是这个步骤并不一定是“编译”,至少ecma规范管这个步骤叫 verify (记忆中)。


我个人认为,你只能说它不是一个传统的纯解释性的语言,但也不能说js是编译语言呀。
38 楼 hax 2007-05-21  
dlee 写道
to sp42:
你的这个解释也有一些问题。另外由于JavaScript引擎创建声明的函数采用的是异步的方式,有些错误你使用调试器未必能跟踪到。因为你进入到调试器中以后,函数肯定是已经创建好了。

我再给出一种可能的解释。很多人认为JavaScript是一种解释型的语言,其实JavaScript完全是一种编译型的语言,它每次都是要将代码先编译到内存后然后才执行的。我估计它是将所有的外部代码也放在一个匿名函数之中来编译的,然后立即执行这个匿名函数。而其他的函数,除了在匿名函数中调用到(直接或间接)的以外,都是放在匿名函数执行完之后才以异步的方式来创建的。

以这种方式来实现,是一种效率较高的实现方式,因为编译或eval是一个相当慢的操作。



不知道您老是怎么得出函数声明是异步的这个结论。至少从ecma-262e3规范和jscript的表现,我无法看出这点。相反,ecma规范是要求函数声明被预先处理的。

关于你说的js的编译问题,我认为你有点夸大了,解释和编译没有很大的分界线,只要保证语义不变,行为一致就可以了。但是js的编译至多类似于java的字节码,甚至连jit也达不到(少数特例js引擎除外),所以你这样说编译是误导的。至于你估计的那个异步过程,我认为是纯粹想像,没有任何证据,而jscript调试器给出的反例你的解释十分无力。
37 楼 hax 2007-05-21  
jindw 写道
在rhino实现里面,函数的变量申明和内部函数申明是分开来管理的。
应该有一个先后,但是初始化函数的位置,又还是原来的位置。

初试化变量的时候,正如dlee所说,创建了一个空函数。

to sp42 你那个工具还没用过呢,看起来不错呢:)
在什么地方的?



没错,这就是spec没说的那部分。js2.0似乎会明确的确认这一点。

这个问题最影响的一点是当时function的scope到底是什么。例如包裹在with之内的function声明,到底是否受到with影响,ff引擎、jscript 5.5+、opera(我只验证过9.0)都是受到的。safari没有测试过。但是jscript 5.0就不受影响。我的pies的内部import特性就依赖于这个标准没有规定的危险特性,呵呵,所以pies在jscript 5的话,就只能用外部import,不能可靠的使用内部import。

sp42的工具就是ms script editor,office或者visual stuidio会带。可以给jscript断点,用来探索jscript的各种bug是不错的,呵呵。
36 楼 hax 2007-05-21  
dlee 写道
以前有个人曾经问过我,我在IE和Firefox上试过,行为都是这样的。

我猜想应该是考虑到执行效率的原因。这样做将创建声明函数(通过eval类似的机制)的工作放在最后,这部分工作可以以异步的方式来做,而不会影响到页面的render,而外部的代码在统一eval之后也可以尽快执行。

所以做JavaScript开发,不应该对函数创建的时机作出假设。而且函数创建的行为可能是异步的,执行到函数声明之后的这条语句时,函数尚未创建是完全有可能的。



同上,你的论断是错误的。

函数声明不管在哪里,都等价于放在该代码块或函数体的最前端。这里不存在异步的问题。而函数表达式则是另一回事情,可以认为是执行到该语句才创建的。

应该说这样一种设计是不太直观的,令人有些混淆,但是目前的现实就是如此。

这里存在两个例外,第一个是eval,eval中如果有函数声明,也是到eval执行的时候才起作用。但是eval内部仍旧是遵循我说的这个规则的。例如 eval('test1(); function test1(){...}'); 这个代码是ok的。另外一个是,按照标准,function声明是不能在statement里的,也就是说如下代码都是错误的:
if (x > 1) {
  function test() {...}
}

with (x) {
  function test() {...}
}


但是ie和moz都接受这个代码(有少数引擎不行,似乎safari就不行),其处理方式却可能不相同,这是spec以外的部分,所以也无话可说。
35 楼 hax 2007-05-21  
jindw 写道
没找到合适的解释


你没有找仔细啊,呵呵。
34 楼 hax 2007-05-21  
dlee 写道
是的,这就是上面我最后补充的一句话的情况:
引用
当然,如果在外部的代码中包含有函数调用,其调用的这个函数是会在调用之前创建的。



你之前的描述是错误的(就ecma规范而言,实际引擎怎么实现,偶们都不清楚)。
根据ecma-262规范edition 3,函数声明(注意var x = function () {}是函数表达式,不是函数声明)会被放到函数体或者代码块的最前端。所以不管外部代码有没有函数调用,都是先创建函数声明所声明的函数(靠,绕口令了)。
33 楼 netfishx 2007-05-16  
引用
netfishx(151431) 14:45:28
哦,这个我也早就想过
netfishx(151431) 14:45:47
某个老外大牛就很坚定的说,js是有预编译的
netfishx(151431) 14:46:02
但在不同的环境下,顺序又有所不同
32 楼 andot 2007-05-10  
这两种有差别,

var a = funciton() {}; 是定义一个变量a,定义一个匿名函数,然后将匿名函数赋值给变量a。

而 function a(){} 只是声明一个名字为a的函数。

function a(){} 比 var a = funciton() {}; 执行效率高一点点。但是 var a = funciton() {}; 这种方式更灵活一些。
31 楼 i_love_sc 2007-05-10  
<div class='code_title'>js 代码</div>
<div class='dp-highlighter'>
<div class='bar'> </div>
<ol class='dp-c' start='1'>
    <li class='alt'><span><span class='keyword'>var</span><span> a = </span><span class='keyword'>function</span><span>() {  </span></span></li>
    <li class=''><span>};  </span></li>
    <li class='alt'><span>  </span></li>
    <li class=''><span><span class='keyword'>function</span><span> a() {  </span></span></li>
    <li class='alt'><span>}  </span></li>
</ol>
</div>
<br/>
这两种申明在效率上有差别吗 ?<br/>
我已经习惯第一种了,因为在我看来,function也是一种基本类型。
30 楼 andot 2007-05-10  
另外,变量定义和变量赋值也是两个过程。var a; 是变量定义,a=1; 是变量赋值,var a=1; 是变量定义和变量赋值。虽然你写在一起,但是这个过程在js解析器解析的过程中也是分两步完成的,变量定义和函数定义是首先完成的,接下来执行的才是变量赋值。
29 楼 andot 2007-05-10  
函数定义是在变量赋值之前完成的,所以函数定义会被变量赋值覆盖,而变量赋值不会被函数定义覆盖。将匿名函数赋值给变量是一个赋值的过程,所以这个会覆盖前面赋值的变量。道理就是这么简单的。

相关推荐

    复杂函数申明解析

    在C或C++编程语言中,函数声明的解析尤其是复杂声明的解析对于初学者和经验丰富的程序员都可能是个挑战。本文将带领读者逐步解析C/C++中的复杂函数声明,包括使用typedef、const关键字以及函数指针的高级用法,并...

    彻底搞定C指针-函数名与函数指针

    但是,函数名与函数指针变量之间存在着一些微妙的区别,我们将在后续的讨论中探索这些区别。 函数指针变量的应用 --------------------- 函数指针变量可以应用于各种场景,例如: * 回调函数:我们可以将函数指针...

    c++笔试面试宝典2009

    二、数组与指针的精细管理:delete与delete[]的微妙差别 delete与delete[]的使用区别在于,delete仅针对单一对象进行操作,而delete[]则针对数组,会逐个调用数组元素的析构函数,确保每个对象的资源都被正确清理。...

    无线充电LCC-S仿真:基于Simulink的高效电磁组竞赛电源系统建模与优化

    内容概要:本文详细介绍了用于智能车竞赛微缩电磁组的无线充电LCC-S仿真模型。该模型采用Simulink搭建,主要针对48V输入、1000W输出的无线充电系统进行仿真。文中不仅提供了具体的谐振参数(如L1=35uH,C1=62nF,C2=72nF),还分享了调整死区时间、耦合系数、负载突变测试等实践经验。此外,作者强调了实际应用中的注意事项,如元件选型、散热设计以及仿真与现实差异的处理方法。 适合人群:参与智能车竞赛的学生和技术爱好者,尤其是对无线充电技术和电力电子感兴趣的读者。 使用场景及目标:①帮助参赛队伍快速建立高效的无线充电系统仿真模型;②指导实际硬件搭建过程中参数的选择和优化;③提高系统效率,确保在比赛中的可靠性和性能。 其他说明:本文提供的模型已在Matlab 2023b中验证可行,建议使用者根据实际情况调整参数,并关注仿真与实际应用之间的差异。

    基于springboot+vue的考研资讯平台管理系统(源码+数据库)239

    基于springboot+vue的考研资讯平台管理系统:前端 vue2、element-ui,后端 maven、springmvc、spring、mybatis;角色分为管理员、学生;集成考研资讯、报考指南、资料信息、客服等功能于一体的系统。 ## 环境-239 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Node 14.14.0</b> - <b>JDK 1.8</b>

    基于GADF+Transformer的轴承故障诊断模型:振动信号转二维图像及深度学习分类

    内容概要:本文详细介绍了将振动信号转化为二维图像并利用Transformer进行轴承故障诊断的方法。首先,通过格拉姆角场(GADF)、小波变换(DWT)和短时傅立叶变换(STFT)将一维振动信号转换为二维图像。然后,构建了一个基于Transformer的视觉模型,用于捕捉图像的全局特征。实验结果显示,该方法在凯斯西储大学轴承数据集上达到了98.7%的准确率,尤其在低信噪比环境下的表现优于传统方法。此外,文中提供了详细的代码实现和数据预处理步骤,以及一些实用的训练技巧。 适合人群:从事机械故障诊断的研究人员和技术人员,尤其是对深度学习应用于工业设备监测感兴趣的读者。 使用场景及目标:适用于工业环境中机械设备的故障预测与健康管理。主要目标是提高故障检测的准确性,特别是在复杂工况和低信噪比情况下,帮助维护团队及时发现潜在问题,降低维修成本。 其他说明:文中提到的所有代码和预训练模型均已开源,可供研究和教学使用。同时,作者分享了一些实践经验,如数据增强策略的选择和信号去噪方法的应用,有助于读者更好地理解和复现实验结果。

    【代码随想录】ACM输入输出模板汇总:多语言实现与典型问题解析

    内容概要:本文档是《卡码网-25种ACM输入输出总结模板.pdf》,由程序员Carl编写,旨在帮助读者掌握ACM竞赛中常见的25种输入输出方式。文档详细介绍了多种编程语言(如C++、Java、Python、Go、JavaScript等)的实现方法,涵盖了从简单的A+B问题到复杂的链表操作、二叉树遍历等各类典型题目。每种输入输出方式均配有相应的练习题,帮助读者通过实际操作加深理解。此外,文档不仅提供代码模板,还强调了对问题的分析和解决思路。 适合人群:具备一定编程基础,尤其是准备参加ACM竞赛或从事算法相关工作的开发者。 使用场景及目标:①帮助读者快速掌握ACM竞赛中常见的输入输出格式;②提高编程效率,减少在笔试和面试中因输入输出处理不当而浪费的时间;③通过练习题巩固所学知识,提升解决实际问题的能力。 阅读建议:由于文档侧重于输入输出模板的总结,建议读者在学习过程中结合具体的编程语言特性进行实践,并尝试完成提供的练习题,以加深对模板的理解和应用。同时,注意不同语言之间的语法差异,灵活运用所学知识。

    基于springboot的健身中心会员管理系统(源码+数据库)199

    基于springboot的健身中心会员管理系统:前端 jsp、jquery,后端 maven、springmvc、spring、mybatis;角色分为管理员、用户;集成会员卡、留言板、公告、统计报表等功能于一体的系统。 ## 功能介绍 ### 客户 - 基本功能:登录,退出,个人资料查看与修改,密码修改 - 我的会员卡:会员卡查询,详情 - 充值信息:充值信息的列表查询,多条件搜索查询,详情 - 我的消费记录:消费记录查询,多条件搜索查询,详情 ### 管理员 - 账号管理:管理员账号信息的增删改查,密码修改 - 公告管理:公告信息的增删改查 - 客户管理:客户信息的增删改查 - 会员卡管理:会员卡信息的增删改查,多条件搜索查询,会员卡充值 - 留言板管理:留言板信息的列表查询,留言回复 - 统计报表管理:消费信息的查询统计,充值信息的查询统计 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Tomcat 7.0.73</b> - <b>JDK 1.8</b>

    基于springboot的教育互助管理系统(源码+数据库)236

    基于springboot的教育互助管理系统:前端 html、jquery,后端 maven、springmvc、spring、mybatis;角色分为管理员、用户;集成交流动态、我的平台、我的好友、互助评论、教育互助等功能于一体的系统。 ## 环境-236 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>JDK 1.8</b>

    multiSIM视频教程-常用仪器仪表使用.zip

    multisim

    手绘彩虹小太阳幼儿教学课件模板.pptx

    手绘彩虹小太阳幼儿教学课件模板

    SH3201数据手册和代码.tar

    SH3201数据手册和代码.tar 产品简介 SH3201是一款六轴IMU(Inertial measurement unit)惯性测量单元。SH3201内部集成三轴陀螺仪以及三轴加速度计,尺寸小,功耗低,适用于消费电子市场应用,能提供高精度的实时角速度与线加速度数据。SH3201具有出色的温度稳定性,在-40℃到85℃的工作范围内能保持高分辨率。 封装形式和尺寸 ● 封装:14 Pins LGA ● 尺寸:2.5×3.0×1.0mm³

    自动驾驶多类交通目标检测数据集1.zip

    数据集介绍:自动驾驶多类交通目标检测数据集 一、基础信息 数据集名称:自动驾驶多类交通目标检测数据集 图片数量: - 训练集:2,868张图片 - 验证集:30张图片 - 测试集:301张图片 分类类别: - Bikes(自行车):交通场景中常见非机动车类型 - Bus(公交车):大型公共交通工具 - Car(汽车):主流机动车辆类型 - Crosswalk(人行横道):道路安全标识 - Fire hydrant(消防栓):城市基础设施组件 标注格式: YOLO格式,包含目标检测所需的边界框坐标及类别标签,支持主流深度学习框架。 数据来源:真实道路场景采集,涵盖多样交通环境。 二、适用场景 自动驾驶感知系统开发: 用于训练车辆环境感知模型,精准识别道路参与者(车辆、行人)及关键基础设施(人行道、消防栓)。 智能交通监控系统: 支持开发实时交通流量分析系统,识别车辆类型及道路安全标识。 道路安全研究: 为交叉路口安全分析、基础设施布局优化提供数据支撑。 AI算法基准测试: 适用于目标检测模型性能验证,覆盖常见交通目标类别。 三、数据集优势 场景覆盖全面: 包含5类关键交通要素,覆盖车辆、行人设施及市政设备,满足复杂场景建模需求。 标注质量可靠: 专业团队标注,严格质检流程确保边界框定位精准,类别标注准确。 任务适配性强: 原生YOLO格式支持主流检测框架(YOLOv5/v7/v8等),即插即用。 应用潜力突出: 数据来源于真实道路场景,可直接应用于L2-L4级自动驾驶系统开发,具备强工程落地价值。

    一个极速,多功能的哔哩哔哩推送机器人.zip

    一个极速,多功能的哔哩哔哩推送机器人

    基于jsp+servlet的机票预订后台管理系统(源码+数据库)128

    基于jsp+servlet的机票预订后台管理系统:前端 jsp、jquery,后端 servlet、jdbc,角色分为管理员、用户;集成航班信息查询,在线订票,订单查询等功能于一体的系统。 ## 功能介绍 ### 管理员 - 航班信息管理:航班信息列表查询,航班添加 - 订单信息管理:用户在前台浏览航班信息,订票下单后,管理员可以在后台查询用户下单信息 - 用户信息管理:用户信息由客户自己在前台注册,管理员可以查看和删除用户 - 留言评论管理:用户在前台针对航班信息或订票服务进行评论,后台查看评论和删除 ### 用户 - 基本功能:登录,注册,退出 - 网站首页:轮播图,航班搜索,航班列表信息展示 - 订票:航班详情,在线订票,填写乘机人和联系人信息,退改签说明,提交订单 - 用户中心:个人资料查询与修改,订单列表查询 - 留言:留言列表查看,发表留言评论 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Tomcat 7.0.73</b> - <b>JDK 1.8</b>

    COMSOL多物理场建模在海底气体水合物沉积物汽液两相流动研究中的应用

    内容概要:本文详细介绍了利用COMSOL进行海底气体水合物沉积物中汽液两相流动的数值模拟。首先,文章解释了模型的基本架构,包括多孔介质流和相场法追踪气液界面,并展示了关键的偏微分方程。接着,讨论了网格划分、水合物相变的能量方程源项设置以及重要参数如各向异性系数的正确配置。此外,文中强调了模型验证步骤,如网格收敛性测试、时间步长敏感性分析和物质守恒检查。最后,分享了一些实际工程应用的经验,如处理非均质储层和相变潜热的影响。 适合人群:从事地质工程、石油勘探、环境科学等领域研究的专业人士和技术人员。 使用场景及目标:适用于需要深入理解和模拟海底气体水合物沉积物中复杂物理现象的研究人员。主要目标是帮助用户掌握COMSOL在这一领域的具体应用方法,提高数值模拟的准确性。 其他说明:文章不仅提供了详细的数学模型和编程代码片段,还分享了许多实践经验,有助于读者避开常见陷阱并优化计算效率。

    Screenshot_2025_0421_055352.png

    Screenshot_2025_0421_055352.png

    Abaqus混凝土收缩建模与分析:从材料定义到结果验证的技术详解

    内容概要:本文详细介绍了如何使用Abaqus进行混凝土收缩建模与分析。首先讲解了混凝土收缩的基本概念及其重要性,接着逐步介绍材料定义、收缩模型选择、收缩应变计算方法(包括UMAT子程序和热膨胀模拟)、分析步配置、边界条件设置、后处理验证等各个环节的具体操作步骤和技术细节。文中还提供了多个实用的Python脚本和.inp文件模板,帮助用户更好地理解和应用相关知识点。此外,作者分享了许多实战经验和常见错误规避技巧,确保模型的稳定性和准确性。 适合人群:从事土木工程仿真分析的专业人士,尤其是有一定Abaqus使用经验的研究人员和工程师。 使用场景及目标:适用于需要进行混凝土结构长期性能预测、裂缝发展模拟等复杂工程问题的研究人员。通过掌握本文提供的技术和方法,能够提高仿真模型的精度,减少与实际测量结果之间的偏差。 其他说明:文中提到的所有代码片段和操作指南均基于最新版本的Abaqus软件平台。建议读者结合官方文档和其他在线资源进一步学习和探索。

    前端分析-2023071100789s

    前端分析-2023071100789s

    基于改进粒子群算法的VMD分解参数优化及其Matlab实现

    内容概要:本文详细介绍了利用改进的粒子群算法(PSO)优化变分模态分解(VMD)参数的方法。首先指出了传统PSO存在的局限性,即容易陷入局部最优解。接着提出了改进措施,包括动态调整惯性权重和学习因子,使得算法能够在前期进行广泛的全局搜索,在后期进行精确的局部搜索。文中还提供了具体的Matlab代码实现,涵盖了数据预处理、粒子初始化、适应度函数选择等方面的内容。实验结果显示,改进后的PSO在优化VMD参数方面表现优异,尽管收敛速度稍慢,但能够获得更低的适应度值,从而提高分解质量。 适合人群:从事信号处理研究的技术人员,尤其是那些对VMD分解有一定了解并希望进一步提升其性能的研究者。 使用场景及目标:适用于需要对一维时序数据进行高质量分解的应用场合,如生物医学信号处理、故障诊断等领域。目标是通过优化VMD的分解层数K和惩罚因子α,达到更好的信号分离效果。 其他说明:文中提到的所有代码均基于Matlab 2018a及以上版本编写,建议使用更高版本以确保兼容性和效率。同时,对于初学者而言,可以先尝试提供的示例数据进行练习。

Global site tag (gtag.js) - Google Analytics