forked from wteam-xq/testDemo
-
Notifications
You must be signed in to change notification settings - Fork 1
/
function.html
197 lines (180 loc) · 7.64 KB
/
function.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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>
函数理解
</title>
<link rel="icon" href="favicon.ico" type="image/x-icon" />
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
</head>
<body>
<h3>函数理解</h3>
<div>1. 函数 add可以实现连续的加法运算, 函数add的语法如下:</div>
<div>add(num1)(num2)(num3)...;</div>
<div>使用举例:</div>
<div>add(10)(10) = 20</div>
<div>add(10)(20)(50) = 80</div>
<div>add(10)(20)(50)(100) = 180</div>
<hr>
<div>2.递归函数</div>
<div>斐波那契数列实现, 实现递归的两种方式:</div>
<div>调用自身函数名(推荐),调用参数对象的方法(严格模式下报错,有时万不得已得用该方法)</div>
<hr>
<div>3.call apply 用法区别:参数个数的区别;</div>
<div> callFun.call(a, 1, 2, 3);</div>
<div>applyFun.apply(a, [1,2,3]);</div>
<hr>
<div>4.有关javascript函数对象(函数当对象字面量使用竟然不报错!) </div>
<div><a href="http://www.zhihu.com/question/31863910" target="_blank">来源</a></div>
<div>"age:"被看作了标签语句(label statement)不会起作用</div>
<hr>
<div>5. 如何在JavaScript里指定一个对象作为上下文去eval字符串?</div>
<div><a href="http://www.zhihu.com/question/31930691" target="_blank">来源</a></div>
<div>比如 d = {x: 1, y: 2} , expr = "x * 2 + y" , 然后evalWith(d, expr) 就返回4</div>
<hr>
<div>6. 关键字"new" 执行时,构造函数的执行过程</div>
<div>6.1 创建一个新对象;</div>
<div>6.2 将构造函数的作用域赋给新对象(因此this就指向了这个新对象)</div>
<div>6.3 执行构造函数中的代码(为这个心对象添加属性、方法)</div>
<div>6.4 返回新对象</div>
<hr>
<div>7.在Javascript中,每一个函数实际上都是一个函数对象.(函数 与 对象的关系) </div>
<hr>
<div>8.arguments、caller 和 callee 介绍</div>
<div> <a href="http://blog.csdn.net/oscar999/article/details/8511335" target="_blank">来源</a></div>
<div>arguments.caller 指向调用该函数的 函数;</div>
<div>arguments.callee 指向当前函数;</div>
<hr>
<script>
// 1. 函数 add可以实现连续的加法运算, 函数add的语法如下:
// add(num1)(num2)(num3)...;
// 使用举例:
// add(10)(10) = 20
// add(10)(20)(50) = 80
// add(10)(20)(50)(100) = 180
// 请使用js代码实现函数add
function add(a) {
var sum = a
function f(b) {
sum += b
return f
}
f.toString = function() { return sum }
return f
}
// alert(add(10)(20)(30)) //60
//看结果的时候必须用alert ,因为alert接收的必须是字符串,所以它会自动调用toString()方法
// console.log(add(20).toString());
// 2.递归函数
// 斐波那契数列实现, 实现递归的两种方式:调用自身函数名(推荐),调用参数对象的方法(严格模式下报错,有时万不得已得用该方法)
function fibonac(n){
if (n <= 0){
return 0;
}else if(n == 1){
return 1;
}else{
return fibonac(n-1) + fibonac(n-2);
}
}
function fibonac2(n){
if (n <= 0){
return 0;
}else if(n == 1){
return 1;
}else{
return arguments.callee(n-1) + arguments.callee(n-2);
}
}
// var test_res = fibonac(8);
// var test_res = fibonac2(8);
// alert(test_res);
// 3.call apply 用法区别:参数个数的区别;
var a = {
a_num: 2,
a_str: '3'
};
function callFun(arg1, arg2, arg3){
var a_num = 1;
var arg_count = arg1 + arg2 + arg3;
alert(this.a_num);
alert(arg_count);
}
function applyFun(arg1, arg2, arg3){
var a_str = '1';
var arg_count = arg1 + arg2 + arg3;
alert(this.a_str);
alert(arg_count);
}
// callFun.call(a, 1, 2, 3);
// applyFun.apply(a, [1,2,3]);
// 4.有关javascript函数对象(函数当对象字面量使用竟然不报错!) 来源:http://www.zhihu.com/question/31863910
// "age:"被看作了标签语句(label statement)不会起作用
function Persion(){
age: 20;
}
// alert(Persion.age);
Persion.age = 20;
// alert(Persion.age);
// 5. 如何在JavaScript里指定一个对象作为上下文去eval字符串?
// 来源 http://www.zhihu.com/question/31930691
// 比如 d = {x: 1, y: 2} , expr = "x * 2 + y" , 然后evalWith(d, expr) 就返回4
var d = {x:1, y:2};
var expr = "x*2 + y";
var imports = ''
for(var k in d){
if( !k.isPrototypeOf(d) ) {
imports += 'var ' + k + ' = this.' + k + ';';
}
}
// Assume that `expr` is an expression
function evalWith(d, expr) {
// return new Function('with (this) { return ' + expr + ' }').call(d);
return (new Function(imports + 'return (' + expr + ')')).call(d)
}
// alert( evalWith(d, expr) );
// 6. 关键字"new" 执行时,构造函数的执行过程
// 6.1 创建一个新对象;
// 6.2 将构造函数的作用域赋给新对象(因此this就指向了这个新对象)
// 6.3 执行构造函数中的代码(为这个心对象添加属性、方法)
// 6.4 返回新对象
function constructorT(){
// t 输出为 {}(空对象), 但其可以共享构造函数原型的方法以及变量;t.b => 'bbbbbb', t.a = functon(){console.log('a fun');}
var t = this;
console.log('what the fuck!');
}
constructorT.prototype.a = function(){
console.log('a fun');
}
constructorT.prototype.b = 'bbbbbb';
// TObj 即为构造函数中的 this
var TObj = new constructorT();
// 7.在Javascript中,每一个函数实际上都是一个函数对象.
function fn(){}
var obj = {}
console.log(fn instanceof Function)//true
console.log(obj instanceof Object)//true
console.log(fn instanceof Object)//true
console.log(obj instanceof Function)//false
console.log(Function instanceof Object); // true
console.log(Object instanceof Function); // true
// 8.arguments、caller 和 callee 介绍
// http://blog.csdn.net/oscar999/article/details/8511335
// arguments.caller 指向调用该函数的 函数
function testCaller() {
var caller = testCaller.caller;
console.log(caller);
}
function aCaller() {
testCaller();
}
aCaller();
// arguments.callee 指向当前函数
function testCallee(arg) {
console.log(arguments.callee);
}
function aCallee(arg1, arg2) { testCallee();}
aCallee();
</script>
</body>
</html>