在Lua中,我创建了自己的Event系统,我想在JavaScript中转换并使用它,这是Lua中的代码:
TriggerEvent = function(Name, ...)
local EventID = nil;
for Event2ID, Table in pairs(Event) do
if(Table.Active and Table.Name == Name) then
EventID = Event2ID;
break;
end
end
if(EventID == nil) then
return false;
end
for ListenerID, Table in pairs(Event[EventID].Listener) do
if(Table.Active) then
Table.Function(...);
end
end
return true;
end
哪个完美无瑕。 这就是我对JavaScript的看法:
TriggerEvent = function(Name, ...) {
var
EventID = undefined
;
for(Event2ID = 0, Length = Event.length; Event2ID < Length; Event2ID++) {
if(Event[Event2ID].Active && Event[Event2ID].Name == Name) {
EventID = Event2ID;
break;
}
}
if(EventID == undefined) {
return false;
}
for(ListenerID = 0, Length = Event[EventID].Listener.length; ListenerID < Length; ListenerID++) {
if(Event[EventID].Listener[ListenerID].Active) {
Event[EventID].Listener[ListenerID].Function(...);
}
}
return true;
}
根本不起作用。
使用示例:
WebsiteConnected = function(Website, Test) {
Website.SetTitle("Hello World");
console.log(Website.GetTitle() + " connected! " + Test);
return true;
}
CreateEvent("WebsiteConnected"); // Moved down.
AddEventListener("WebsiteConnected", WebsiteConnected);
TriggerEvent("WebsiteConnected", (Website || {}), "Test"); // Moved down.
答案 0 :(得分:0)
这里&#34;可选&#34;参数在Javascript中工作:
如果您编写如下函数:
function doSomething(arg1, arg2, arg3) {
// Insert quality code here :-)
}
使用任何个参数调用此函数(或任何其他函数)是有效的Javascript。
如果传入少于指定的三个参数,则其余参数将默认为null。
如果传入三个以上的参数,则会忽略额外的参数。
如果你想&#34;过载&#34;一个函数,在Javascript中没有这样的东西。如果一个函数需要为一个参数接受两种不同的类型,那么该函数必须检查传入的内容的类型并相应地表现。
此外,还有arguments
对象,它为传递给当前正在执行的函数的参数提供类似于数组的接口。出于某种原因,语言的开发有一个怪癖,arguments
对象的行为很像数组,但不是数组。 : - /
答案 1 :(得分:0)
我为我之前要求的事情做了一个工作,这是我的系统:
// ------------------------------------------------------------------------------------------------- Event "Class"
Event = function() {
var
Public = this,
Private = {}
;
Public.Create = function(Name) {
if(Private.Created) {
return false;
}
Private.Created = true;
Private.Name = Name;
Private.Function = [];
return true;
}
Public.Delete = function() {
if(! Private.Created) {
return false;
}
Private = {};
Private.Created = false;
return true;
}
Public.IsCreated = function() {
if(! Private.Created) {
return false;
}
return true;
}
Public.SetName = function(Name) {
if(! Private.Created) {
return false;
}
Private.Name = Name;
return true;
}
Public.GetName = function() {
var
Name = ""
;
if(! Private.Created) {
return Name;
}
Name = Private.Name;
return Name;
}
Public.AddFunction = function(Function) {
if(! Private.Created) {
return false;
}
for(var FunctionID = 0, Length = Private.Function.length; FunctionID < Length; FunctionID++) {
if(Private.Function[FunctionID] == Function) {
return false;
}
}
Private.Function[Private.Function.length] = Function;
return true;
}
Public.HasFunction = function(Function) {
if(! Private.Created) {
return false;
}
for(var FunctionID = 0, Length = Private.Function.length; FunctionID < Length; FunctionID++) {
if(Private.Function[FunctionID] == Function) {
return true;
}
}
return false;
}
Public.Call = function() {
if(! Private.Created) {
return false;
}
var
Arguments = ""
;
for(var argumentID = 0, Length = arguments.length; argumentID < Length; argumentID++) {
Arguments += "arguments[" + argumentID + "]";
if(argumentID != (arguments.length - 1)) {
Arguments += ", ";
}
}
for(var FunctionID = 0, Length = Private.Function.length; FunctionID < Length; FunctionID++) {
eval("Private.Function[FunctionID](" + Arguments + ")");
}
return false;
}
Public.Create(arguments[0]);
return Public;
}
var
TestEvent = new Event("TestEvent")
;
TestEvent.AddFunction(
function() {
console.log("TestEvent called.");
}
);
TestEvent.AddFunction(
function(String, String1) {
console.log(String1 + String);
}
);
TestEvent.Call("world!", "Hello ");
这完美无瑕。我已经进行了很多基准测试。