执行函数

exc(exp, ctx) 执行表达式

执行表达式exp。
对象ctx可选,将与当前执行环境上下文数据$ctx合并后给exp使用。

excA(exp, ctx) 执行表达式

异步执行表达式exp;A是Async(异步)的首字母。参考异步函数

excs(exp, count, ctx) 多次执行

多次执行表达式exp,共count次,当前执行$x次,从0次开始;其它同上

$break()终止循环

特殊地,forEach()和excs()里可以使用$break()函数终止循环。注:$break()不能终止forEachA()和excsA()。

excsA(exp, count, ctx) 多次执行

异步多次执行表达式exp;A是Aasync(异步)的首字母。参考异步函数

stopIf(condition, exp) 条件停止

当条件condition为真时执行表达式exp(可选)但停止执行后续表达式(即终止事件执行)。即使此表达式是在循环/$exp/函数里也一样,但除了异步函数外。

func(exp) 函数构造器

把表达式exp作为函数体包装成函数,并持有当前执行环境(如$l、$exp)。调用此函数时传进来的参数将合并成数组$arg传给表达式执行环境。
包装成的函数是异步执行,即不等待函数体执行完就马上执行下一行表达式,即使它的函数体很可能是同步执行的。参考异步函数

直接执行exc(exp)与函数调用$v.fn = func(exp); $v.fn()的异同

  1. 用法不同
    第一种是在当前环境直接执行表达式exp。第二种是先定义成函数(即把表达式封装成函数)再执行。

  2. 传参不同
    第一种通过传入ctx对象合并到其执行环境中,表达式直接取用;第二种通过传入任意数量的参数,函数体通过$arg数组及其参数位置下标取得。

  3. 受stopIf()的影响不同
    stopIf()里的条件为真时第一种会立刻停止所有表达式的执行,不管是exc()被执行体内部的表达式还是当前执行体外部表达式。而第二种仅会停止函数体内部后续表达式的执行而不会影响调用它的当前环境外部后续的表达式的执行。当然,如果是异步执行(excA或excsA)则与函数同。

  4. 执行上下文不同
    函数的执行上下文是其定义的地方而不是其被调用的地方,而执行表达式是直接把表达式拿到当前上下文执行,无论它是哪里定义的。

  5. 当需要被多个地方多次执行时推荐使用函数;如果只是临时执行一下,比如符合某种条件时执行两三句表达式时推荐用直接执行。

    比如一个组件C的事件中要执行在onReady定义的内部表达式$exp.A,而$exp.A又需要执行另一个内部表达式$exp.B。
    如果是第一种方式,需要先把onReady定义的内部表达式转换成作用域更大的变量中(如页面表达式),$v.A = $exp.A; $v.B = $exp.B,在$exp.A里应该用$v.B而不是$exp.B,因为组件C不认识onReady的内部表达式$exp.B,这样在组件C执行exc($v.A)时就好像$exp.A和$exp.B都是在组件C中定义的一样。但此时$exp.A和$exp.B里要谨慎使用stopIf()
    如果是第二种方式,需要先把$exp.A封装成函数$v.A = func($exp.A),在组件C中调用$v.A()即可。但要注意$exp.A和$exp.B拿到的上下文数据都是onReady的而不是组件C的。此时$exp.A或$exp.B中的stopIf()并不会阻住组件C继续执行函数后面的表达式。

nop() 空函数

no operation的缩写,nop()本身什么也不做,直接返回一个空函数。
常用来简化执行多个参数,比exc(““)省一对引号。
在三元表达式中经常在某个条件下要执行多个函数,量少时一般是把多个函数表达式放在exc(““)里,如exc($l.arr = [1, 2, 3]; log($l.arr)),量多时则放入内部表达式$exp中,如exc($exp.name)
把这些函数表达式作为另一个函数的参数时也会执行,如nop($l.arr = [1, 2, 3], log($l.arr))。这些函数没额外的执行上下文,也不会等上一个函数执行完了才执行下一个,所以不会有返回值$r,也不适合依赖render()和timeout()等函数。
注意,exc()里多个函数用分号; ,nop()里用逗号, 间隔;exc()里要用引号,nop()不用。

Make in ZC APP Platform