您的位置:首页 > Web前端 > JavaScript

Livescript 学习

2016-03-22 16:40 411 查看

Livescript 学习 – Function 篇

在学习ls过程中,感觉function篇蛮重要的,所以记录下来供回顾学习

如果哪里有错误烦请评正,特别最后一个 Partial Application…

参考链接:LiveScript官网链接

1.新建函数

非闭包函数

->                              # 空函数
(x, y) -> x + y                 # 匿名函数
do-return = (x, y) -> x * y     # 名为doReturn的函数 默认return x * y
no-return = (x, y) !-> x * y    # 名为noReturn的函数 取消默认返回 x+2
function func-name then 2       # 定义一个函数名字用function,或者按照上面定义的写法; 默认返回 2
!function func-name then 2      # 增加!取消默认返回2
times = (x, y, z) --> x * y * z # 柯里函数


闭包函数: 对于普通命名函数可以在前面使用 ~ ;匿名函数可以使用 ~> ;对于柯里函数使用 ~~>

~function add x, y
@result = x + y   # 闭包this
## 编译为:var this$ = this;
##        function add(x, y){
##          return this$.result = x + y;
##        }
obj = new
@x      = 10
@normal = -> @x # 非闭包函数
@bound  = ~> @x # 闭包函数


2.函数调用

简单调用

f!                    # 无参数调用
Math.pow x, 3         # 后接 x 和 3 参数
do function f x
x                   # 定义完成函数f后立即执行
$ \h1 .find \a .text! # 链式调用 $('h1').find('a').text();
func do
a: 1
b: 2                # 传入一个对象参数;也可以是 func {x: 1, y: 2}
3 `add` 4             # 使用‘`’调用 ;等价于 add(3, 4) -- 貌似只能调用两个参数的
g = (a, b) -> f ...   # 调用父函数的所有参数 -- f.apply(this, arguments);


快速调用:适用于高阶函数,类似于map 或者 filter 之类的-- (obj.) 速记为 (it) -> obj[it]

map (.length), <[ hello there you ]>
## 编译为:map(function(it){ return it.length; }, ['hello', 'there', 'you']);

filter (.length < 4), <[ hello there you ]>
## 编译为:filter(function(it){ return it.length < 4; }, ['hello', 'there', 'you']);


3.关于参数

一些特殊参数调用

set-person-params = (person, person.age, person.height) -> person # 像一个对象一样确定每一个对象的属性值
set-text = (@text) -> this      # @相当于this
add = (x = 4, y = 3) -> x + y   # 设置默认值
add = (x && 4, y || 3) -> x + y # 设置一些逻辑 例如 x && 4 就是如果x不是null就赋值为4
set-cords = ({x, y}) -> "#x,#y"
# 改变参数的属性,例子的返回值转变为 string : x + "," + y; 也可以设置默认值 set-cords = ({x = 1, y = 3} = {}) -> "#x,#y" 其中 = {} 用于确定参数不是 null
f = (x, ...ys) -> x + ys.1  # 分割参数可用;这个例子是除了第一个x参数外,其它参数形成的数组为ys

-----参数类型转换-----
f = (!!x) -> x              # 把x转换为bool值
g = (+x) -> x               # 把x转换为一个数字
h = (^^x) -> x.prop = 99; x # 深度复制x这个对象

-----如果只有一个参数可以用it代表它-----
f = -> it + 2

-----可以使用'&'代表argument这个对象-----
add-three-numbers = -> &0 + &1 + &2
## 编译为:var addThreeNumbers = function(){
return arguments[0] + arguments[1] + arguments[2];
};


4.柯里函数

柯里函数:可以将一个n参数的函数转换为参数 < n 的函数 : - -> 定义

-----闭包柯里函数使用 '~~>' 定义-----
times = (x, y, z) --> x * y * z
next-one = times 2 4              # 转换为一个固定了x = 2,y = 4的函数
next-one 5                        # 结果为 2 * 4 * 5 = 40
times 2 2 2                       # 也可以正常地调用,结果为8


5.关于let和new

let 是 (function(a){…}.call(this, b)) 的缩写

let $ = jQuery
$.isArray []
## 编译为:(function($){
##           $.isArray([]);
##        }.call(this, jQuery));

------也可以定义@-----
x = let @ = a: 1, b: 2
@b ^ 3
## 编译为:var x = (function(){
##          return Math.pow(this.b, 3);
##       }.call({ a: 1, b: 2 }));


new 相当于使用new新建一个对象

dog = new
@name = \spot
@mutt = true
## 编译为: var dog = new function(){
##           this.name = 'spot';
##           this.mutt = true;
##        };


6.回调函数

回调函数;正常 : <- 闭包 : <~ 柯里函数 : <- - 柯里函数闭包 : <~~

data <-! $.get 'ajaxtest'
$ '.result' .html data
## 编译为:$.get('ajaxtest', function(data){ $('.result').html(data); });
# 理解方法:将$.get('ajaxtest')得到的数据作为data,
# 接着data作为参数传给下一句的回调函数(匿名函数)内容为: $ '.result' .html data


7.部分应用

部分应用:可以用 _ 代表一个apply的函数

filter-nums = filter _, [1 to 5]
filter-nums even  # 得到[2,4]
# 具体的编译可到ls官网在线编译观看
# 理解:_代表了一个要apply的函数,这里相当于把even这个函数当作filter函数中第一个参数(过滤函数)进行调用;这个主要用途在于如果你暂时不想立即定义一个固定的函数作为参数便可以使用这种方法来占位

-----可以使用默认的参数,如果无参数调用则它会执行并返回本身 >> 这一部分我也不太懂,只能初步了解 -----
[1 2 3]
|> par-func =  _.map _, (* 2) # 通过管道导入参数[1, 2, 3];输出为: [2, 4, 6]
par-func [3 4 5]              # 传参数[3, 4, 5];输出为: [6, 8, 10]
par-func                      # 返回函数本身
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LiveScript javascript