使用循环函数简化代码
Simplify the code by using cycle function
我有使用相同循环代码的乘法函数,我想知道是否可以通过使用一个循环函数来简化代码,这样我就可以通过调用所需的函数名称来执行代码。
现在:
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");
}
}
没有名字space使用:
window["functionName"](arguments);
所以把它包起来并这样使用它:
cycle(someFunction);
function cycle(name){
for(var i=0;i<all;i++){
window[name](i);;
}
}
有名字space,包括:
window["Namespace"]["myfunction"](i);
window['lineGroup.lines['+i+'].'+callFunction+'()'];
字面意思 尝试访问以 lineGroups.lines[0]
开头的 属性。这样的 属性 只有当你明确地做了 window['lineGroups.lines[0]'] = ...
时才会存在,我相信你没有。
完全没有必要涉及window
。只需访问对象的 line
属性:
this.lines[i][callFunction]();
i get no error but the function is not executed.
访问不存在的 属性 不会产生错误。示例:
window[';dghfodstf0ap9sdufgpas9df']
这会尝试访问 属性 ;dghfodstf0ap9sdufgpas9df
,但由于它不存在,这将导致 undefined
。由于未对 return 值进行任何操作,因此无法观察到任何变化。
请注意,这可能有点矫枉过正,但是使用一个函数来创建一个 class 对象(你可以 google makeClass 以及为什么它 is/could 有用)你可以创建对象的实例。
// 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();
我有使用相同循环代码的乘法函数,我想知道是否可以通过使用一个循环函数来简化代码,这样我就可以通过调用所需的函数名称来执行代码。
现在:
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");
}
}
没有名字space使用:
window["functionName"](arguments);
所以把它包起来并这样使用它:
cycle(someFunction);
function cycle(name){
for(var i=0;i<all;i++){
window[name](i);;
}
}
有名字space,包括:
window["Namespace"]["myfunction"](i);
window['lineGroup.lines['+i+'].'+callFunction+'()'];
字面意思 尝试访问以 lineGroups.lines[0]
开头的 属性。这样的 属性 只有当你明确地做了 window['lineGroups.lines[0]'] = ...
时才会存在,我相信你没有。
完全没有必要涉及window
。只需访问对象的 line
属性:
this.lines[i][callFunction]();
i get no error but the function is not executed.
访问不存在的 属性 不会产生错误。示例:
window[';dghfodstf0ap9sdufgpas9df']
这会尝试访问 属性 ;dghfodstf0ap9sdufgpas9df
,但由于它不存在,这将导致 undefined
。由于未对 return 值进行任何操作,因此无法观察到任何变化。
请注意,这可能有点矫枉过正,但是使用一个函数来创建一个 class 对象(你可以 google makeClass 以及为什么它 is/could 有用)你可以创建对象的实例。
// 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();