javascript - 函数(function(parameter){
问题描述
我对以下代码有几个问题:
这是什么类型的函数,左侧有括号但函数之前没有名称?这是一种特殊的功能吗?
基本上这个函数接受回调作为侦听器,它是否定义并一起运行?
_
(function(handlers) {
Object.keys(handlers).forEach(function(observableName) {
var observable = app.ko.observable().extend({
notify: 'always'
});
that[observableName] = observable;
var f = handlers[observableName];
if (f) {
observable.subscribe(f);
}
});
})({
onCallIgnored: defaultCallHandler,
onCallStateChanged: function(call) {
that.videoState(call.getRemoteVideoState());
},
onPlacingCall: function(call) {
callParams = app.utils.cloneObj(call);
},
onIncomingCall: function(call) {
that.activeCall = call;
callParams = app.utils.cloneObj(call);
setCallEstablishingTimeout();
app.playSound("ringtone");
that.callProgressTime("");
},
onUpdateCallInfo: function(call) {
console.log(call);
}
});
解决方案
这是什么类型的函数,左侧有括号但函数之前没有名称?这是一种特殊的功能吗?
该函数是一个通过环绕它anonymous
转换为 a的函数。通过添加另一个,您正在调用函数表达式。此类调用的函数表达式称为IIFE(立即调用函数表达式),这意味着您在定义函数后立即调用该函数。function expression
()
()
例如
(function(x) {console.log(x);})(2); // paints 2
基本上这个函数接受回调作为侦听器,它是否定义并一起运行?
是的,函数是一起定义和运行的。IIFE 将定义的值()
作为参数并将其传递给函数。
(function(arg1, arg2, ...argN){ ... // function definition})(param1, param2, ... paramN);
所以,IIFE的解体如下
功能定义
function(handlers) {
Object.keys(handlers).forEach(function(observableName) {
var observable = app.ko.observable().extend({
notify: 'always'
});
that[observableName] = observable;
var f = handlers[observableName];
if (f) {
observable.subscribe(f);
}
});
}
函数参数 1(处理程序)
{
onCallIgnored: defaultCallHandler,
onCallStateChanged: function(call) {
that.videoState(call.getRemoteVideoState());
},
onPlacingCall: function(call) {
callParams = app.utils.cloneObj(call);
},
onIncomingCall: function(call) {
that.activeCall = call;
callParams = app.utils.cloneObj(call);
setCallEstablishingTimeout();
app.playSound("ringtone");
that.callProgressTime("");
},
onUpdateCallInfo: function(call) {
console.log(call);
}
}