在JavaScript中传递多个可选参数

时间:2014-08-19 14:06:24

标签: javascript function lua optional-arguments

在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.

2 个答案:

答案 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 ");

这完美无瑕。我已经进行了很多基准测试。