Function的含义

函数定义

//函数声明式定义
function foo(num1,num2){
    return num1 + num2;
}
//函数表达式定义
var foo = function(num1,num2){
    return num1 + num2;
};
//使用Function构造函数定义
var foo = new Function("num1","num2","return num1 + num2");
//实际上创建一个Function实例并不一定要赋值给具体的指针,可以直接执行
(function(x,y){return x+y})(1,2);
//之所以用圆括号把function(){}括起来是因为js解释器会将function解释为函数声明,而函数声明不能直接跟着(x,y),我们需要将其转换为函数表达式。
//(1,2)表示要传递跟函数的参数。
//上面的例子也可以写成:
function foo(x,y){
    return x+y;
}(1,2);
//函数声明的方式无法定义匿名函数,因此如果想使用匿名函数,则必须用函数表达式的定义方式。

函数的对象特性

因为函数是Function的实例,而函数名仅仅是该实例的一个引用地址。因此可以作为参数和返回值参与到函数的传参过程中。

function call_some_function(some_function, some_argument) {
    return some_function(some_argument);
}
function add_10(num) {
    return num + 10;
}
console.log(call_some_function(add_10,20)); //30

函数的内部属性

arguments | this

  • arguments对象中保存着传递给函数的参数
  • arguments.length返回传入参数的个数
  • Notelength属性表示函数定义时候默认接收的参数数量。arguments.length表示函数实际执行时接收的参数数量。
function test_arguments() {
    if (arguments.length == 2) {
        console.log(arguments.length); 
        console.log(arguments); 
    } else {
        console.log(arguments.length); 
        console.log(arguments); 
        arguments.callee(4, 5);
    };
}(1, 2, 3)
/**
 3
{ '0': 1, '1': 2, '2': 3 }
2
{ '0': 4, '1': 5 }
 **/
  • arguments.callee()主要用在递归函数中调用函数自身的情境中。js和别的语言不同在于函数名只是一个指针,可以随时变化,函数中利用函数名来调用自身属于高耦合,可能会出现问题,而arguments.callee()调用自身就会规避掉这个问题
function factorial(num) {
    if (num <= 1) {
        return 1;
    } else {
        return num * factorial(num - 1);
    };
}
function callee_f(num) {
    if (num <= 1) {
        return 1;
    } else {
        return num * arguments.callee(num - 1);
    };
}
factorial(10); //运行正常
f = factorial;
factorial = null;
f(10); //error

callee_f(10); //运行正常
f = callee_f;
callee_f = null;
f(10); //运行正常
  • this主要用来帮助函数引用函数所处作用域中的对象。
var color = 'red';
function syaColor() {
    console.log(this.color);
}
syaColor(); //red
var o = new Object();
o.color = 'blue';
o.sayColor = sayColor;
o.sayColor(); //blue

call()和apply()

call()和apply()是每个函数都包含的自有方法。之前已经提到了函数是定义的对象,那么调用函数时候,函数中的this是对当前与下变量的调用。而如果想改变函数执行所在域空间,则可以使用call()和apply()来实现。

color = 'red';
var o = {color: 'blue'};
function sayColor() {
    console.log(this.color);
}
sayColor(); //red
sayColor.call(this); //red
sayColor.call(o); //blue

app()和call()的作用是相同的,区别主要在于传入参数的不同。

call(this,para1,prar2,prar3) 第一个参数是函数要执行的作用域,后面的参数是函数的输入参数,有多少个依次写多少个。

apply(this,[para1,para2,prara3])第一个参数也是函数要执行的作用域,后面是一个Array的数组对象。

使用call()/apply()来扩充作用域最大的好处是对象和方法的解耦。

内置对象

Global对象可以理解成最外层的对象,所有的对象,以及不属于其它对象的属性和方法都被包含在Global对象中。
isNaN(x) 用来检查参数x是否为数字。如果为数字返回false,否则返回true
isFinite(x) 用来检查参数x是否为无穷大/小,如果是无穷大/小,则返回true
parseInt(x) 用来解析字符串并返回整数
parseFloat(x) 用来解析字符串并返回浮点数
encodeURI()encodeURIComponent()会对字符串进行特殊的UTF-8编码,规避一些特殊字符来让浏览器能够读懂。他俩的区别主要在于encodeURI()不会对本身属于URI的特殊字符进行编码,而encodeURIComponent()会对其发现的所有非标准字符进行编码。

var uri = "http://www.wrox.com/illegal value.htm#start";
//http://www.wrox.com/illegal%20value.htm#start
console.log(encodeURI(uri))
//http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start
console.log(encodeURIComponent(uri))
  • 对应的解码函数为decodeURI()decodeURIComponent()
  • eval(script) 用来将script的内容在解释器中执行并返回对应的结果。非常强大!

Note:在浏览器中,windows对象封装了Global对象,并承担了很多额外的任务和功能。

Math对象为另一个内置对象。为JavaScript提供了数学计算功能。

<think>好的,我现在需要回答用户关于Simulink中S-Function的simsizes的具体含义和用法的问题。用户之前可能已经了解了一些S-Function的基础知识,现在想深入理解simsizes的作用。首先,我应该回忆一下自己了解的S-Function结构,特别是初始化部分。记得S-Function的模板中有simsizes这个结构体,它用于定义模块的各种参数,比如输入输出端口的数量、状态变量的类型和数量等。用户可能想知道这个结构体每个字段的具体含义,以及如何正确设置这些字段。我需要详细解释每个字段的作用,例如NumContStates表示连续状态的数量,NumDiscStates是离散状态,NumOutputs和NumInputs是输入输出的端口数量,DirFeedthrough处理直接馈通等。 另外,用户可能在实际使用中遇到问题,比如如何根据模型需求配置这些参数。这时候需要举例说明,比如设置一个带有两个输入和一个输出的模块,应该如何填充simsizes结构体。同时,要提到初始化函数mdlInitializeSizes中如何使用simsizes,并通过sys=simsizes(sizes)来生成sys变量,供Simulink使用。还需要注意可能出现的错误,比如未正确设置DirFeedthrough导致仿真失败,或者输入输出维度不匹配的问题。这时候可以引用之前提到的引用[1]和[2],说明初始化阶段的重要性,以及各个子函数的分工,特别是mdlInitializeSizes的作用。最后,生成相关的问题,帮助用户进一步学习,比如如何添加连续状态或处理离散状态,或者如何优化S-Function的性能。这些问题应该与simsizes的使用紧密相关,引导用户深入理解S-Function的结构和设计。</think>### simsizes在S-Function中的具体含义和用法 在MATLAB/Simulink的S-Function中,`simsizes`是一个**关键结构体**,用于**定义模块的基本特性**,例如输入/输出端口数量、状态变量类型(连续/离散)等。其作用主要体现在初始化阶段(`mdlInitializeSizes`子函数中),为Simulink提供模块的配置信息[^1][^2]。 --- #### 1. **simsizes结构体的字段定义** `simsizes`包含以下主要字段: | 字段名 | 作用 | |----------------------|--------------------------------------------------------------------| | `NumContStates` | 连续状态变量的数量(如微分方程中的状态) | | `NumDiscStates` | 离散状态变量的数量(如差分方程中的状态) | | `NumOutputs` | 输出端口的数量(若为动态大小,可设为`-1`) | | `NumInputs` | 输入端口的数量(若为动态大小,可设为`-1`) | | `DirFeedthrough` | 直接馈通标志(`1`表示输出依赖输入,`0`表示不依赖) | | `NumSampleTimes` | 采样时间的数量(通常为`1`,表示单速率模块) | --- #### 2. **用法示例** 在`mdlInitializeSizes`函数中需按以下步骤配置: ```matlab function sys = mdlInitializeSizes sizes = simsizes; % 创建simsizes结构体 sizes.NumContStates = 0; % 无连续状态 sizes.NumDiscStates = 1; % 1个离散状态 sizes.NumOutputs = 1; % 1个输出端口 sizes.NumInputs = 1; % 1个输入端口 sizes.DirFeedthrough = 1; % 输出直接依赖输入 sizes.NumSampleTimes = 1; % 单一采样时间 sys = simsizes(sizes); % 生成sys配置参数 end ``` - **直接馈通(DirFeedthrough)**:若输出方程中包含输入变量(如`y = u + 1`),则必须设为`1`,否则Simulink会报错[^2]。 - **动态维度**:若输入/输出端口维度由外部信号决定,可将`NumInputs`或`NumOutputs`设为`-1`,并在`mdlOutputs`中动态获取维度。 --- #### 3. **常见问题与注意事项** - **状态变量冲突**:若同时设置`NumContStates`和`NumDiscStates`为非零值,需在`mdlDerivatives`(连续)和`mdlUpdate`(离散)中分别实现状态更新逻辑[^2]。 - **采样时间设置**:需在`mdlInitializeSizes`后通过`sys(7)`指定采样时间(如`sys(7) = -1`表示继承仿真步长)[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值