开始正文之前,先看一个例子:
代码是在微信小程序的环境下编写的
/** 异步测试 */
asyncRequest: function() {
return new Promise((resolve, reject) => wx.request({
url: 'test.php',
success: resolve,
fail: reject
}))
}
asyncRequest().then(res => {
console.log('成功', res)
}).catch(err => {
console.log('失败', err)
})
以下是结果:
可以看到在asyncRequest()
中的fail
中,并没有进行赋值操作,但是在调用这个方法后,却打印出了结果。下面开始正文:
/** 函数的基本定义,需要调用才能执行 */
function f1(value) {
return '函数基本定义';
}
/** 没有名字的函数表达式,需要调用才能执行 */
var f2 = function(s) {
console.log('函数表达式', s);
};
/** 有名字的函数表达式,需要调用才能执行 */
var f3 = function f(s) {
//f只在这个范围内有效,函数外无效,这种方式可以适用于递归方式
console.log('有名字的函数表达式_1', s);
console.log('有名字的函数表达式_2', f);
}
f3('aaaaaaaaa')
/** ES6函数表达式,需要调用才能执行 */
var f4 = v => v + v;
// 等同于
var f5 = function(v) {
return v + v;
};
/** 回调函数 */
function f6(callBack) {
callBack(5)
}
f6(function(value) {
console.log('匿名函数的使用', value)
})
/** ES6函数表达式,函数返回对象的方式 */
var f8 = (key, value) => ({
key: key,
value: value
})
console.log('函数中对象的返回方式', f8(1, 2))
/** 对象中的函数使用 */
var o = {
f9: function(value) {
console.log('对象函数的使用1', value)
},
f10(value) {
console.log('对象函数的使用2', value)
},
f11: value => {
console.log('对象函数的使用3', value)
return '结果f8'
},
f12: value => '结果f9',
f13: f2,
f2
}
o.f9(1)
o.f10(2)
var result_11 = o.f11(3)
console.log('result', result_11)
var result_12 = o.f12(3)
console.log('result', result_12)
o.f13('对象中的函数表达是1')
o.f2('对象中的函数表达是2')
注意函数使用的时候调用()与不调用()有所区别:
()是执行的意思,没有括号只有函数名则是只使用了引用地址,这个引用地址在其它地方加上()就又执行了该引用地址的函数,比如:
var f14 = function () {
return '执行函数f14';
}
console.log(f14)
console.log(f14())
下面是执行结果:
根据以上的例子进行最初的代码仿写:
function rs(o){
o.success('success')
o.error('error')
}
function test(callback){
function f1(value){
console.log('f1',value)
}
function f2(value){
console.log('f2', value)
}
callback(f1,f2)
}
// test((f1,f2) => {
// f1(1)
// f2(2)
// })
test((f1, f2) => rs({
success:f1,
error:f2
}))
下面的执行后的结果: