我对以下代码有几个问题:
这个左侧有括号但没有括号的功能是什么 功能前的名字?这是一种特殊的功能吗?
基本上,此函数接受回调作为侦听器,是否已定义 和一起跑?
_
(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);
}
});
答案 0 :(得分:1)
功能
(function(handlers) {
...
})()
是一个自执行的匿名函数(也称为立即调用的函数表达式)。见this tutorial 好的解释。
当这个代码由JS解释器执行时,它将使用您作为参数传递的一组处理程序立即定义并调用该函数。
答案 1 :(得分:1)
左边有括号但没有括号的功能是什么 功能前的名字?这是一种特殊的功能吗?
该函数是anonymous
函数,通过在其周围包裹function expression
将其转换为()
。通过添加另一个()
,您将调用函数表达式。这样的调用函数表达式被称为IIFE(立即调用函数表达式),这意味着您可以在定义函数后立即调用该函数。
e.g。
(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);
}
}