如何通过一系列的对象的若第功能
-
16-09-2019 - |
题
我想通过一个目列的setTimer功能在Javascript。
setTimer("foo(object_array)",1000);
我越来越错误,这个代码。
**注:**对不起!一些正在我的问题:是否有可能在若第()function.
解决方案
使用匿名的功能,而不是一串的第一个参数 目 或 若第一个 职能:
// assuming that object_array is available on this scope
setInterval(function () { foo(object_array); }, 1000);
为什么它的工作:
在定义内的功能,可以参考的变量存在于他们的 外围的功能后,即使其父母职能已经终止。
这种语言的特征是所谓 关闭.
如果你通过一个字符串的第一个参数的这些职能,代码将执行内部使用一个电话的 eval 功能,这样做是 不 认为作为 良好的实践.
Eval提供直接访问JavaScript编译器执行码是通过与特权的呼叫者,也使用eval 反复地/广泛地 (即你若第一个函数是一个很好的例子)将导致性能的问题。
其他提示
我要对卢克的答案在这里展开,因为它解决了CMS(以及大多数回答这类的问题)不使用案例。
如果您需要将参数绑定到函数调用的的时候,你设定的超时的,一个简单的函数的外壳将无法正常工作:
echo = function (txt) { console.log(txt); };
val = "immediate A";
echo(val);
val = "delayed";
window.setTimeout(function () { echo(val); }, 1000);
val = "immediate B";
echo(val);
假设你在后面使用萤火虫的控制台,上述将输出“即时A”,“立即B”,然后“立即B” 1秒。该值在setTimeout调用使用卢克的陷阱方法的时间约束。以下修改它有点接受任意的功能和参数长度:
echo = function (txt) { console.log(txt); };
trap = function (fn, args) {
return function() {
return fn.apply(this, args);
};
};
val = "immediate A";
echo(val);
val = "delayed";
window.setTimeout( trap(echo, [val]), 1000);
val = "immediate B";
echo(val);
不知道是否有通过调用者的上下文中隐含的方式,但它可以进一步扩大接受上下文的说法,如果“this”没有得到你。
第一,它的 '的setTimeout'
第二,不传递的字符串。真正的解决方案取决于代码的其余部分。最可靠的方法将是陷阱范围:
var obj_array = something;
function trap(obj)
{
function exec() { foo(obj); }
return exec;
}
setTimeout(trap(obj_array), 1000);
陷阱返回具有您的阵列被困在其范围的函数。这是一个通用的功能,但使它具体到你的问题,它可以简化为:
var obj_array = something;
function trap()
{
function exec() { foo(obj_array); }
return exec;
}
setTimeout(trap(), 1000);
甚至:
var obj_array = something;
function trap()
{
foo(obj_array);
}
setTimeout(trap, 1000);
和最后冷凝下来:
var obj_array = something;
setTimeout(function() { foo(object_array); }, 1000);
编辑: 我的函数(或至少1次迭代他们的我在这里备份找到)
Function.prototype.createDelegate = function(inst, args) {
var me = this;
var delegate = function() { me.apply(inst, arguments); }
return args ? delegate.createAutoDelegate.apply(delegate,args) : delegate;
};
Function.prototype.createAutoDelegate = function() {
var args = arguments;
var me = this;
return function() { me.apply({}, args); }
};
下式给出:
function test(a, b) { alert(a + b); }
用法:
setTimeout(test.createAutoDelegate(1, 2), 1000);
或给予:
var o = { a:1, go : function(b) { alert(b + this.a); }}
用法:
setTimeout(o.go.createDelegate(o,[5]), 1000);
//or
setTimeout(o.go.createDelegate(o).createAutoDelegate(5), 1000);