Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript函数何时执行_Javascript - Fatal编程技术网

javascript函数何时执行

javascript函数何时执行,javascript,Javascript,我想这一定是一个简单的问题,但我一直在四处寻找,没有找到答案 我的想法是,我有一个html页面,其中包含一些脚本(在正文中),如下所示: <script type="text/javascript">grf();</script> grf(); grf()函数是在外部.js文件中定义的。 问题是:浏览器加载页面及其所有外部js文件后是否执行此函数?或者在加载.js文件之前执行函数?如果是这样,我如何防止这种情况发生?当浏览器加载页面时,当页面到达块的末尾时,将执行该方

我想这一定是一个简单的问题,但我一直在四处寻找,没有找到答案

我的想法是,我有一个html页面,其中包含一些脚本(在正文中),如下所示:

<script type="text/javascript">grf();</script>
grf();
grf()函数是在外部.js文件中定义的。
问题是:浏览器加载页面及其所有外部js文件后是否执行此函数?或者在加载.js文件之前执行函数?如果是这样,我如何防止这种情况发生?

当浏览器加载页面时,当页面到达
块的末尾时,将执行该方法。如果外部JS文件包含在调用此方法的页面下方,它将抛出一个错误(未定义方法)

如果您想等待页面和资源加载完毕,最好使用库。建议使用内置的
onload
事件是有限的,因为它只支持添加一个处理程序(添加另一个将覆盖上一个处理程序)。下面是一个示例,使用:


$(文档).ready(函数(){
//代码在这里
});

遇到函数时会运行该函数。如果希望它在页面加载后运行,标准方法是钩住窗口的onload事件。jQuery对此非常支持,但让我们从底层开始:

<script type="text/javascript">window.onload = function() { grf(); }</script>
window.onload=function(){grf();}
这将踩踏页面上以前分配的任何其他onload处理程序,这就是为什么大多数人会小心地使用它链接到以前的处理程序:

<script type="text/javascript">$(document).ready(function() { grf(); });</script>
$(document).ready(函数(){grf();});

当然,对于第二个示例,您需要在页面的更上一层包含jQuery库(听起来您似乎没有能力这样做)。

浏览器在看到标记时执行它。不仅其他脚本可能尚未加载,DOM也可能尚未构建。但是,可以保证脚本按照它们在HTML中出现的顺序执行

如果您可以使用jQuery,那么它有$.ready()函数,当DOM就绪时调用回调,因此每个脚本都已加载。像这样使用它

$.ready(grf);

或者使用常用的匿名函数

防止脚本出现问题的最佳方法是使用JavaScript库,如jQuery、Mootools等,这样可以很容易地将任何代码绑定到各种事件(dom.ready等),以确保事先完全加载所有内容。

只要脚本文件包含在函数用法之上,函数就可用。浏览器遇到错误时将停止渲染

<script src="..."></script>

标签。只有在下载并解析脚本后,它才会恢复处理文档页面。因此,脚本中定义的任何函数都将在以下时间之后立即可用:

<script src="..."></script> <!-- Browser waits until this script is loaded -->
<script>
   foo(); // if function foo was in the script above, it is ALWAYS available now
</script>

foo();//如果函数foo在上面的脚本中,那么它现在总是可用的

这实际上并不总是一种理想的行为——有时您不想等待脚本下载,因为它可能会使您的代码看起来很慢。一种技术是在所有HTML都已呈现的情况下,让所有脚本在
之前加载并在页面底部执行。

查看是否定义了函数:

// functions are defined or undefined just like regular variables
function myFunc() {
   /*--code here--*/
}

// So we just need to see if it's defined
if( myFunc ) {
   /*--do something here--*/
} else {
   /*--wait, retry or w/e--*/
}
当找到外部脚本时,(x)html将不会被进一步读取,直到外部脚本被读取(如果有任何可执行代码,则执行内部代码)


因此,在外部文件“包含”后调用外部文件中的函数无法生成未定义函数错误。(但是,请记住,如果该外部函数试图操作DOM或页面中仍然“不存在”的元素,则会出现错误。)

该函数运行后,会遇到其调用(
grf()
)。@Jonathan Fingland-是的,非常适合包含非jQuery示例,但问题没有提到jQuery。jQuery现在才被假定吗?@timdown这个问题太基本了,它被假定为jQuery超出了范围。问题似乎是源代码脚本的缓慢异步加载是否会造成其功能不可用的情况。答案应该是,因为脚本加载是同步的,所以这不是一个问题。这个问题的措辞不是很好,但我认为这是阅读OP的mind+1的最佳尝试。为什么这个答案被否决了?直接传递函数而不是将其封装在额外的匿名函数中是完全合法的。@gumbo因为它不太清楚发生了什么-OP可能对javascript来说已经足够新了。@gumbo作为记录,我同意你的观点,不应该否决它(答案也是我+1)感谢您回答关于何时执行函数的第一个问题。对于第二个问题,大多数人似乎都同意最好的选择是使用jQuery。然而,我想知道是否有可能知道是否定义(加载)了一个函数。例如,我可以这样做来确保一个元素已经被加载:function ff(){if(!document.getElementById('elem'))setTimeout('ff()',250);//从这里我可以使用'elem'}但是有没有办法知道是否定义了一个函数?@victor-使用:if(typeof(functionName)!='undefined'){//function exists}如果不使用任何LIB,并且希望运行使用DOM的代码,最可靠的方法是在close body标记之后添加脚本标记,而不是使用轮询机制。
If(myFunc)
如果myFunc未定义,将导致错误<代码>如果(typeof myFunc==“undefined”)不会(如z0n所述)
// functions are defined or undefined just like regular variables
function myFunc() {
   /*--code here--*/
}

// So we just need to see if it's defined
if( myFunc ) {
   /*--do something here--*/
} else {
   /*--wait, retry or w/e--*/
}