Javascript 如何编写一个直到解析完js文件的其余部分才运行的函数

Javascript 如何编写一个直到解析完js文件的其余部分才运行的函数,javascript,Javascript,假设我在脚本上有一个函数,当给定一个哈希映射函数名{string}到它下面定义的函数时,在代码中: collect({"f1" : f1, "f2" : f2 }) 问题是如果collect位于页面顶部,则f1、f2、。。将指向未定义,因为这些函数尚未定义。简单的解决方法是将收集放在页面底部。但是,如果我顽固地需要它位于顶部,我如何延迟collect的执行,直到所有其他函数都被解析 注意,其余函数的定义形式如下: var name; name = function(){ .. } 奖金问题

假设我在脚本上有一个函数,当给定一个哈希映射函数名{string}到它下面定义的函数时,在代码中:

collect({"f1" : f1, "f2" : f2 })
问题是如果
collect
位于页面顶部,则f1、f2、。。将指向未定义,因为这些函数尚未定义。简单的解决方法是将
收集
放在页面底部。但是,如果我顽固地需要它位于顶部,我如何延迟collect的执行,直到所有其他函数都被解析

注意,其余函数的定义形式如下:

var name; 
name = function(){ .. }
奖金问题:

如果我可以定义
collect
,这样就不用向函数传递has映射名,只需传入函数列表或字符串列表,就可以达到同样的效果,效果会更好。所以在代码中,类似于

collect([f1,f2]) 
collect(["f1","f2"])

更新:我想我没有明确地说出我的问题。我特别希望延迟函数的执行,直到解析文件的其余部分。我不想通过其他改变我试图做的事情的语义的黑客来复制这种行为

我想是你学习物体和原型的时候了。使用prototype
Whatever.prototype={f1:…,f2:…}
创建一个对象
函数Whatever(){}
,并使用
this
使函数引用其他函数:

function Whatever() {};
Whatever.prototype = {
  f1: function() {
    // don't care that this function doesn't exist yet,
    // because what an object is built from this prototype,
    // ALL functions will exist at the same time. Handy.
    this.f2("this is a string");
  },
  f2: function(s) {
    console.log(s);
  }
}; 
var what = new Whatever();
what.f2("lol");
what.f1();

您可以将
collect
的执行延迟到运行完所有操作之后,例如使用
setTimeout

function collect(o) { /.../ }

setTimeout(function() { collect({"f": f}); }, 0);

var f = function f() {}

在当前执行上下文完成之前,引擎不会执行任何事件回调(包括超时处理程序)(好吧,不完全是这样,请参阅,特别是步骤11.+12.)。下面是一个带有一些人为延迟的示例,演示这些内容。

为什么不明确定义它们
function name(){}
如果你想无缘无故地固执,那么就把脚本作为文本而不是脚本加载,用正则表达式或其他东西把它拆开,然后先
eval
第二部分,然后是第一部分——这够顽固/愚蠢的了吗-我没有询问回调,文件中的其他函数已定义但未执行。他们只是坐在那里,所以他们不可能在上面调用这个函数。除非你建议我在页面底部写一个特殊函数,这样它就可以调用
collect
,这并不是一个真正的解决方案。如果你能解释为什么
collect
不能放在底部,也许我们可以更好地理解这个问题。collect是
export
的别名,按照惯例,应该放在文件的顶部。所以我在家酝酿一个模块系统,我知道如何实现原型继承。这不是一个关于如何通过其他实现复制所需的函数调用顺序的问题,而是一个关于延迟函数执行直到解析文件的其余部分的问题。不,这实际上是关于复制。你想做的不是如何去做你想实现的事情。原型继承是一个
Whatever.Prototype=newparentobject()的问题;Whatever.prototype.constructor=Whatever
。我想我的问题被误解了。我明确地询问函数执行的顺序。函数“collect”与下面的所有函数完全正交,它们不共享状态或操作相同的数据,因此不会以任何方式形成内聚对象。这里发生的事情是,我在问如何制作外表酥脆但里面有嚼劲的培根,这里的许多人都说不,不,我们已经用over easy解决了这个问题,你需要用鸡蛋。你的比喻站不住脚。你在问如何在200华氏度的烤箱里烹调外皮脆内有嚼劲的培根(你已经决定了方法),我们告诉你不要用200华氏度的烤箱,而是用一个好的平底锅。根据您更新的问题,您的问题不是问题:将您的电话放在文件末尾,完成。它将最后执行,其他所有内容都已声明。如果这不起作用,你仍然没有正确地解释你需要什么。我推荐一个JSFIDLE示例,其中有“我期望X,但它正在做Y。我如何做X?”如问题中所述,我需要在页面顶部运行函数,我如何保证文件的其余部分在任何延迟t?IIRC下都被解析,在当前执行帧完成之前,引擎不会处理任何事件(包括超时)。添加了规范链接(+fiddle)