使用循环函数

时间:2015-11-03 00:07:44

标签: javascript cycle simplify

我有使用相同循环代码的乘法函数,我想知道是否可以通过一个循环函数来简化代码,这样我就可以通过调用想要的函数名来执行代码。

现在:

for(var i=0;i<all;i++){ someFunction(i) }

需要:

cycle(someFunction);
function cycle(name){
    for(var i=0;i<all;i++){
       name(i);
    }
}

我试图通过使用“window”来做到这一点,我没有得到任何错误但是没有执行该功能。

var MyLines = new lineGroup();
MyLines.createLines(); // works
MyLines.addSpeed();    // doesn't work


var lineGroup = function(){
    this.lAmount = 5,
    this.lines = [],

    this.createLines = function (){
        for(var i=0,all=this.lAmount;i<all;i++){
            this.lines[i] = new line();
        }
    },

    this.addSpeed = function (){
        // no error, but it's not executing addSpeed function
        // if i write here a normal cycle like in createLines function
        // it's working ok
        this.linesCycle("addSpeed");
    },
    this.linesCycle = function(callFunction){
        for(var i=0,all=this.lAmount;i<all;i++){
            window['lineGroup.lines['+i+'].'+callFunction+'()'];
        }
    }
}

var line = function (){
    this.addSpeed = function (){
        console.log("works");
    }
}

3 个答案:

答案 0 :(得分:1)

没有名称空间使用:

window["functionName"](arguments);

将它包起来并使用它:

cycle(someFunction);
function cycle(name){
    for(var i=0;i<all;i++){
       window[name](i);;
    }
}

使用命名空间,包括:

window["Namespace"]["myfunction"](i);

答案 1 :(得分:1)

window['lineGroup.lines['+i+'].'+callFunction+'()'];

字面上尝试访问以lineGroups.lines[0]开头的属性。只有当你明确做出window['lineGroups.lines[0]'] = ...我确定你没有这样做时,这样的属性才会存在。

根本不需要涉及window。只需访问对象的line属性:

this.lines[i][callFunction]();
  

我没有收到任何错误但是没有执行该功能。

访问不存在的属性不会产生错误。例如:

&#13;
&#13;
window[';dghfodstf0ap9sdufgpas9df']
&#13;
&#13;
&#13;

这会尝试访问属性;dghfodstf0ap9sdufgpas9df,但由于它不存在,这将导致undefined。由于没有对返回值进行任何操作,因此无法观察到任何变化。

答案 2 :(得分:1)

请注意,这可能有点过分,但使用函数创建类对象(您可以google makeClass以及为什么它可能有用),您可以创建对象的实例。

// makeClass - By Hubert Kauker (MIT Licensed)
// original by John Resig (MIT Licensed).
function makeClass() {
    var isInternal;
    return function (args) {
        if (this instanceof arguments.callee) {
            if (typeof this.init == "function") {
                this.init.apply(this, isInternal ? args : arguments);
            }
        } else {
            isInternal = true;
            var instance = new arguments.callee(arguments);
            isInternal = false;
            return instance;
        }
    };
}
var line = function () {
    this.addSpeed = function () {
        console.log("works");
    };
};
var LineGroup = makeClass();

LineGroup.prototype.init = function (lineNumber) {
    this.lAmount = lineNumber?lineNumber:5,
    this.lines = [],

    this.createLines = function (mything) {
        console.log(mything);
        var i = 0;
        for (; i < this.lAmount; i++) {
            this.lines[i] = new line();
        }
    },

    this.addSpeed = function () {
        console.log("here");
        this.linesCycle("addSpeed");
    },
    this.linesCycle = function (callFunction) {
        console.log("called:" + callFunction);
        var i = 0;
        for (; i < this.lAmount; i++) {
            this.lines[i][callFunction]();
        }
    };
};
var myLines = LineGroup();
myLines.createLines("createlines"); 
myLines.addSpeed();
//now add a new instance with 3 "lines"
var newLines = LineGroup(3);
newLines.createLines("createlines2")
console.log("addspeed is a:" + typeof newLines.addSpeed);
console.log("line count"+newLines.lAmount );
newLines.addSpeed();