函数(function) 复杂数据类型

任意程序代码进行封装,需要用的时候进行调用,函数的封装:封装了一段或多段被重复调用的代码块,目的:让大量代码重复使用

  • 函数定义方式
函数关键字(声明式)定义(命名函数)
    function 函数名(){封装的程序代码}           函数调用:函数名()
赋值式定义(字面量)(匿名函数) 匿名函数可以作为函数的参数
    var (变量名) = function(){封装的程序代码}   函数调用:变量名()


  • 函数参数

        定义:在函数内部:某些值不能固定,可以通过参数再调用函数时传递不同的值进去,函数传参的过程本质就是给形参变量赋值,是不用声明的局部变量

        参数就是一个变量(形参)和值(实参)

        实参>形参:多的形参忽略掉

        形参>实参:多的形参输出是undefined数据类型(未定义的,未赋值)

        参数默认值技巧:

function printStar(num) { var num = num || 5}
  • arguments

        是当前函数的内置对象(只要函数才有arguments对象,而且每个函数都内置好了),arguments对象存储了传递的所有实参[]以伪数组的形式存储,没有数组常用方法,可以遍历

function fn(){  
    console.log(arguments)//里面存储了所以传递过来的实参[]伪数组的形式
    console.log(arguments.length)
    console.log(arguments[0])
}
fn(1,2,3,4)
  • return语句(函数返回值)

        没有值:返回undefined(未定义的)  没有return也返回undefined
        有值:将值返回给函数调用语句,遇到return都会停止后面的代码(类似bark) 后面一般不跟代码,只能返回一个值 num1,num2(返回最后一个) 返回多个值可以数组

  • js作用域

        就是代码名字(变量)在某个范围内起作用和效果--为了提高程序的可靠性和命名冲突(不同作用域相同变量名不会冲突)

        函数体中可以访问函数外面变量

        函数体外不能访问函数内变量

一、全局作用域

                整个script标签或者一个单独的js文件

二、局部作用域(函数作用域)

                在函数内部就是局部作用域(这个代码的名字只在函数内部起效果和作用)

三、变量作用域:根据作用域不同分为全和局

        1、全局变量

                在全局作用域下生明的变量(script标签下的变量)

                如果在函数内部直接赋值没有声明的变量也是全局变量

        2、局部变量

                在局部作用域下声明的变量(函数内部的变量)

                形参也是局部变量

        3、执行效率

                    全局变量只要浏览器关闭的时候才会销毁

                    局部变量当程序(函数)执行完毕就会销毁 节约资源

  • 作用域链

一、变量访问规则

        首先在自己作用域>>>如果没有在上级作用域找>>>如果还是没有继续上级,直到全局作用域查找>>>如果全局作用域也没有就报错(typeof 变量 undefined)

二、变量的赋值规则

        在自己作用域查找变量,如果找到直接赋值>>>没找到在上级作用域查找,直到全局作用域查找>>>如果全局作用域也没有,自动创建一个变量再给他赋值

  • 预解析

        浏览器(js引擎)执行源代码之前,会对源代码进行预处理,这种操作称预解析

        1. 声明式定义的函数提前 (赋值式定义的函数不提前)

        2. var 声明的变量提前 (值不会提前)

函数名不要和变量名相同,函数优先被访问,如果变量在前,会把变量当作函数,下面的函数调用当作变量

变量预解析(变量提升)
    把所有的变量声明var提升到当前作用域最前面,提升示赋值
        var a=b=c=9== var a=9;b=9;c=9 (bc是全局变量)
        var a=9,b=9,c=9==var a=9 var b=9 var c=9
    函数预解析(函数提升)
        函数表达式定义会提前
            因为var声明 变量提前 会提前 但是函没提前
                var fn
                    fn=function(){}
                函数关键字定义会提前
                    全部提升 function(){}
  • 递归函数

        将函数调用语句写在函数体内,自己调用自己,称为递归函数

        函数中也要有改变递归函数执行条件(循环也要有改变循环的条件),否则会死递归

一、执行栈

        运行过程中有个栈保存的过程 一层层的弹

        也叫调用栈,具有LIFO(Last in, First out 后进先出)结构,用于存储在代码执行期间创建的所有执行上下文

二、递归的缺点

        递归会层层嵌套 层层返回 效率不高

function fb(n) {
    if (n == 1 || n == 2) {
    return 1
}
    return fb(n - 1) + fb(n - 2)
}
var f = fb(9)
console.log(f);

在 MATLAB 中,S-Function(系统函数)是一种用户自定义的模块化组件,通常用于 Simulink 模型中。它可以让你编写复杂的算法并通过 C、C++ 或 MATLAB 代码将它们集成到仿真环境中。对于 S-Function 输入数据类型的支持非常重要,因为它决定了如何处理传入的数据。 ### S-Function 输入数据类型的管理 #### 1. 定义输入端口的数据类型 当你创建一个 S-Function 时,需要声明每个输入信号端口所接受的数据类型。你可以通过设置特定属性来控制这一点。例如,在基于 M 文件 (MATLAB) 编写的 S-functions 中,可以通过 `mdlSetInputPortDataType` 函数指定某个输入端口支持的数据类型;而在 C 和 C++ 编程环境下,则需使用对应的 API 来完成此操作。 ##### 示例(M 文件 S-Function): ```matlab function [sys,x0,str,ts] = mySFcn(t,x,u) % 设置第一个输入端口接收单精度浮点数(single) set_param(gcb,'NumberofInputPorts','1'); setup_port_properties(1,DYNAMICALLY_TYPED); ... [sys,x0,str,ts]= mdlInitializeSizes; function setup_port_properties(portIdx,portType) if portIdx == 1 set_param(gcs,... 'InputSignalTypes', {'single'}, ... % 设定为单精度 ... end ``` #### 2. 使用内置函数查询和支持多种数据类型 为了提高灵活性和兼容性,有时候你需要让 S-function 支持多种可能的数据类型而不仅仅是单一固定的一种。这时可以借助一些辅助宏如 `ssGetInputPortRequiredContiguous()` 等来进行判断,并根据实际情况调整内部逻辑以适应不同类型的数据输入。 #### 3. 数据类型转换 如果希望强制所有的输入都转成某种特定类型再进行进一步的操作,可以在接收到数据后立即应用相应的类型转换命令。比如从任意实数类型向双精度 (`double`) 或者单精度 (`single`) 浮点数转换: ```c /* 在 C/Simulink S-Functions */ real_T *uPtr; // uPtr指向输入缓冲区 int_T width = ssGetInputPortWidth(S, 0); /* 获取宽度 */ for(int i=0;i<width;i++){ real_T valueAtIthPosition = *uPtr++; double convertedValueAsDouble = mxIsClassIDSupportedForConversion(valueAtIthPosition,MX_SINGLE_CLASS)?mxConvertToDouble(valueAtIthPosition):valueAtIthPosition; } // 继续后续计算 ``` 或者更简单地使用 MATLAB 内置的功能来做这种转换: ```matlab inputDataSingle = single(inputDataOriginal); ``` ### 总结 总之,当涉及到 S-Function 的时候,理解并恰当地管理其输入输出数据类型是非常关键的一环。正确配置这些选项有助于避免潜在的运行期错误同时也能保证高效的性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值