ZhangYang's Blog

Handlerbars.js模板引擎

Handlerbars.js官网

http://handlebarsjs.com/

使用

HTML = structure + data

HTML = 结构 + 数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 结构
<div class="entry">
<h1>{{title}}</h1>
<div class="body">
{{body}}
</div>
</div>
// 数据
data = {title: "My New Post", body: "This is my first post!"}
// 「编译」出 HTML
let html = Handlebars.compile(结构)(数据)
// 例子
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>柯里化</title>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</head>
<body>
<script src="https://cdn.bootcss.com/handlebars.js/4.0.12/handlebars.min.js"></script>
<script>
let code = '<p>{{xxx}}</p>'
let data = {xxx: 'zhangyang'}
let html = Handlebars.compile(code)(data)
console.log(html)
</script>
</body>
</html>

柯里化

柯里化就是「减少参数」:如果你固定某些参数,你将得到接受余下参数的一个函数

Handlebars.compile(code)(data) 就用到了 curry

柯里化的形式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>柯里化的形式</title>
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</head>
<body>
<script src="https://cdn.bootcss.com/handlebars.js/4.0.12/handlebars.min.js"></script>
<script>
let code = '<p>{{xxx}}</p>'
let 中间函数 = Handlebars.compile(code)
let html = 中间函数({xxx: 'frank'})
let html2 = 中间函数({xxx: 'jack'})
console.log(html)
console.log(html2)
</script>
</body>
</html>
// 柯里化的实现
// 传3个参数
function calc(operator,number1,number2){
switch(operator){
case '+':
return number1 + number2
case '-':
return number1 - number2
case '*':
return number1 * number2
case '/':
return number1 / number2;
}
}
console.log(calc('+',1,2))
console.log(calc('+',10,20))
// 柯里化减少传2个参数
function calc(operator,number1,number2) {
switch(operator){
case '+':
return number1 + number2;
case '-':
return number1 - number2;
case '*':
return number1 * number2;
case '/':
return number1 / number2;
}
}
function add(number1,number2){
return calc('+',number1,number2)
}
console.log(add(1,2))
console.log(add(10,20))

反柯里化

反柯里化就是增加参数

1
2
3
4
5
6
7
8
9
10
11
// 反柯里化的实现
function fn(p1,p2){
console.log(this)
console.log(p1)
console.log(p2)
}
function fn2(context,p1,p2){
return fn.call(context,p1,p2)
}
fn2(1,2,3) // 1 2 3