首先函数会构建作用域,把jQuery传进去,可以减少作用域查找。
如果不把jQuery当参数传递,则你使用变量jQuery/$的时候,首先会在函数体内查找,然后进fn查找,最后到window下查找。
而你把jQuery传进去之后,则只需要在函数体内查找$即可。
如果以后依赖的是Zepto/jqlite,你只需要改下参数就行了,在这种极端的情况下,降低了代码修改和可复用成本。
匿名函数有两种形式:lambda表达式、匿名方法
1、先讲委托的使用:
2、匿名方法:没有名字的方法,不需要名字的方法。
匿名方法是没有名称只有主体的方法。
3、方便开发和使用的委托 Action,Func
Func : 首先来说明Func委托,通过MSDN我们可以了解到,Func委托有如下的5种类型:
(1) delegate TResult Func();
(2)delegate TResult Func(T1 arg1);
(3) delegate TResult Func(T1 arg1, T2 arg2);
(4)delegate TResult Func(T1 arg1, T2 arg2, T3 arg3);
(5)delegate TResult FuncT1 arg1, T2 arg2, T3 arg3, T4 arg4);
其中(1)只能委托无参但是有返回值的函数,TResult就是其返回类型。
而(2)只能委托具有一个传入参数,有返回值的函数,T1为一个传入参数,TResult为返回类型。
(3)只能委托具有二个传入参数,有返回值的函数,T1和T2为两个传入参数,TResult为返回类型,(4)和(5)以此类推。
例子·:
Action : 封装一个方法,该方法只有一个参数并且不返回值
public delegate void Action<in T>(T obj);
来看看Action委托的几种表现形式:
(1) delegate void Action(); 无参,无返回值
(2) delegate void Action(T1 arg1);
(3)delegate void Action(T1 arg1, T2 arg2);
(4)delegate void ActionT1 arg1, T2 arg2, T3 arg3);
(5)delegate void ActionT1 arg1, T2 arg2, T3 arg3, T4 arg4);
从上面可以看出,总共有5中表现形式,其中(1)既没有传入参数,也没有返回值,那么它适合代理那些无参,无返回值的函数;(2)有一个传入参数,无返回值,适合代理有参,无返回值的函数,(3)(4)(5)以此类推。最都容纳四个传入参数。
例子
使用匿名函数句柄就可以了 fmincon 需要的函数fun只有一个输入参数 fun(x) 而你的函数需要多一个能改变的变量。
1、在到达迭代次数阈值或目标函数估值次数阈值时,求解器没有最小化目标到要求的精度,此时求解器停止。接下来,可以尝试以下方法:
(1)设置‘Display’为‘iter’,查看每步的迭代信息,这些信息包括:目标函数(Fval or f(x) or Resnorm)是否是下降的;检查约束越界(Max constraint)是否是递减趋向于0;查看一阶优化是否是递减趋向于0;查看置信域半径(Trust-region radius)是否下降趋向于一个小的值。若其中至少一种情况为是,就表示结果是不断改善的。如果结果是不断改善的,可以采取下边的措施:设置MaxIter、MaxFunEvals比默认值大的值,默认值可以在优化工具箱或求解器的函数参考页的优化表中查看;从最后计算出的点开始重新求解。如果结果没有改善,尝试以下其他的方法。
(2)放松精度
如果TolX或TolFun太小,当求解器达到一个最小值时可能也不会识别到,这就会导致无限次徒劳的迭代。DiffMaxChange和DiffMinChange选项能影响求解器的改善,它们控制求导估计中有限差分的步长。
2、无可行点
在TolCon约束精度内,求解器不能找到一个满足所有约束条件的点,此时,可以尝试以下方法:
(1)检查线性约束
通过求解一个线性规划问题来找到一个满足界约束和线性约束的点。
i)定义一个目标函数是常值0的线性规划问题、
f = zeros(size(x0)); % assumes x0 is the initial point
ii)求解这个线性规划问题看是否有一个可行点。
xnew = linprog(f,A,b,Aeq,beq,lb,ub);
iii)如果有可行点xnew,用xnew作为初始点去求解原始问题。
iv)如果没有可行点,那说明原始模型建的不好,检查界约束和线性约束。
b1,b2,function(d1)为形参
c1为实参,d1的实际参数在 a函数的定义中,
比如
function a(b1,b2){
consolelog(b1);
b2(1);//传入参数d1的调用 这里 1就代表d1
}
var c1 = 1;//不定义实参会报错
a(c1, function(d1){alert(d1);})//传入参数d1
我有一个带参数的callback,如何把参数传递给callback呢?
我从stackoverflow中看到几个非常漂亮的答案: https://stackoverflowcom/questions/3458553/javascript-passing-parameters-to-a-callback-function
法一:在callback函数 tryMe 外面封装一个无参的匿名函数,在匿名函数内部显示调用参数:
法二:类似法一,不过匿名函数保留一个参数,供调用函数 callbackTester 在调用匿名函数时,由 callbackTester 决定传什么参数进去。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)