Javascript函数是否自动执行?

Javascript函数是否自动执行?,javascript,google-visualization,Javascript,Google Visualization,我无法理解为什么加载JSP文件时这两个javascript函数会自动执行。先执行procChart函数,然后执行drawChart。我知道drawChart是在加载Google可视化API时调用的。有趣的是,如何先调用procChart,然后再自动执行下一个脚本。有人能解释一下吗 代码- <%@page import="java.util.ArrayList"%> <%@ page language="java" contentType="text/html; charset=

我无法理解为什么加载JSP文件时这两个javascript函数会自动执行。先执行procChart函数,然后执行drawChart。我知道drawChart是在加载Google可视化API时调用的。有趣的是,如何先调用procChart,然后再自动执行下一个脚本。有人能解释一下吗

代码-

<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!--Load the AJAX API-->
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript"
    src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript">   
    function procChart(){

        <% System.out.println("Inside procChart"); %>

        var ExpList = new Array();
        ExpList = request.getParameterValues("chkExps");
        ExpList.push(request.getParameter("expId"));

        <jsp:useBean id="compare"
            class="org.server.experiment.CompareResults" />

            <%int[][] data4= compare.getResult(request.getParameter("expId"), request.getParameterValues("chkExps")  ,request.getParameter("field")); %>;
            <% System.out.println(data4); %>
    }
</script>

<script type="text/javascript">

    google.load('visualization', '1', {
        'packages' : [ 'corechart' ]
    });

    // Set a callback to run when the Google Visualization API is loaded.
    google.setOnLoadCallback(drawChart);

    function drawChart() {

        var te= new Array();

         <% for (int i=0; i<data4.length; i++) { %>
            var xe = [];
         <% for (int j=0; j<data4[i].length; j++) { %>
            xe[<%= j %>] = <%= data4[i][j] %>;

         <% } %>
            te.push(xe);
         <% } %>

        var data = new google.visualization.DataTable();
        var len = te[0].length;
        data.addColumn('string', 'Experiment');

        for(var k=0; k < te.length; k++){
            data.addColumn('number', 'Exp'+(k+1));
        }
        data.addRows(len);
        for (var i = 0; i < len; i++) {

            data.setCell(i, 0, ""+(i+1));
            for (var j = 0; j < te.length; j++) {


                data.setCell(i, j+1, te[j][i]);
            }
        }

        // Instantiate and draw our chart, passing in some options.
        var chart = new google.visualization.LineChart(document
                .getElementById('chart_div'));
        chart.draw(data, {
            width : 900,
            height : 500
        });
    }
</script>

</head>

<body>
    <!--Div that will hold the Line chart-->
    <div id="chart_div"></div>
</body>
</html>
注意-代码运行得非常好,我得到了所需的图表。我只是好奇它是如何工作的。

drawChart之所以执行,是因为下面这行代码

google.setOnLoadCallback(drawChart);

我知道,我在问题描述中提到了这一点。我想知道为什么先调用procChart,然后再执行下一个脚本。你检查了包含的js了吗?我不熟悉您正在使用的库,但该函数似乎是从您包含的javascript文件中调用的。这些是Ajax和jquery实现所需的标准库。我不认为这些标准库会自动调用用户定义的函数。通常在这些情况下,我使用开发人员工具,在函数内部设置断点,并查看调用堆栈。由于drawChart是一个OnLoad事件处理程序,它的执行会延迟,从而给procChart调用时间。我不知道procChart在哪里被调用。@cookiemonster-这是我的观点,我没有明确地调用procChart,但它仍然被自动调用并执行。我无法理解这种行为。如果您没有调用procChart并且没有使用它,那么只需从代码中完全删除它,您就会看到谁会抱怨。@AntoJurković-我需要procChart函数从服务器获取数据。所以需要在调用drawchart之前执行它。在我上面粘贴的代码中就是这样。我只是不知道为什么会这样。我的意思是,我从未在任何地方调用procChart,但它仍然被执行。如果我删除procChart,drawchart将不会有任何数据进行绘图。我看到了data4变量。您的环境中有调用它的java代码吗?