在Javascript中调用另一个函数

时间:2016-07-21 16:27:16

标签: javascript google-analytics-api

我有以下脚本:

gapi.analytics.ready(function() {
  viewSelector.on('viewChange', function update (data) {
  var title = document.getElementById('view-name');
  title.innerHTML = data.property.name + ' (' + data.view.name + ')';

  activeUsers.set(data).execute();
  renderWeekOverWeekChart(data.ids);
  renderTopBrowsersChart(data.ids);
  renderTopCountriesChart(data.ids);

  setTimeout(function() {
    var list = document.getElementsByTagName("tr")[0];
    list.getElementsByTagName("th")[0].innerHTML = "Pagina's";
    list.getElementsByTagName("th")[1].innerHTML = "Paginaweergaven";
  }, 500); 
 });
});

在以下代码中我想重新运行update();功能

function datumwissel( datumbtn ) {
 if ( datumbtn.className == 'maand' ) {
    datumbtn.className = 'jaar';
    dimensions1 =  'ga:month,ga:nthMonth';
    start1 = moment(now).date(1).month(0).format('YYYY-MM-DD');
    end1 = moment(now).format('YYYY-MM-DD');
    start2 = moment(now).subtract(1, 'year').date(1).month(0).format('YYYY-MM-DD');
    end2 = moment(now).date(1).month(0).subtract(1, 'day').format('YYYY-MM-DD');
    format1 = 'M';
    format2 = 'MMM';
    update();
 } 
 else {
    datumbtn.className = 'maand';
    dimensions1 =  'ga:date,ga:nthWeek';
    start1 = moment(now).subtract(2, 'day').date(1).format('YYYY-MM-DD');
    end1 = moment(now).format('YYYY-MM-DD');
    start2 = moment(now).subtract(2, 'day').date(1).subtract(1, 'month').format('YYYY-MM-DD');
    end2 = moment(now).subtract(2, 'day').date(1).subtract(1, 'day').format('YYYY-MM-DD');
    format1 = 'YYYYMMDD';
    format2 = 'Do';
    update();
  }
 }  

但不知怎的,这不起作用。我也试过上面的脚本: window.update = function (data) {}。但这也行不通。

如何调用update();内的gapi.analytics.ready(function() {}函数?

重要的是,我无法全球化,因为它必须位于gapi.analytics.ready()内。

2 个答案:

答案 0 :(得分:1)

移动函数声明真的很简单

function update (data) {
  // same as existing code
}

gapi.analytics.ready(function() {
  viewSelector.on('viewChange', update );
});

在你的其他功能中调用它时传入所需的数据

function datumwissel( datumbtn ) {
 if ( datumbtn.className == 'maand' ) {
    ..........

    update(datumbtn);
 }....... 

答案 1 :(得分:0)

重要的是首先提到Important is that I cannot make it globally as it has to be situated inside the gapi.analytics.ready() - 这实际上并不正确 - 您可以同时将其全局化。你是否想要,是一种不同的方式,因为它会污染全局命名空间等等。但是,这是如何实现的:

首先,在ready处理程序之外提取更新函数,如此

function update (data) {
  var title = document.getElementById('view-name');
  title.innerHTML = data.property.name + ' (' + data.view.name + ')';

  activeUsers.set(data).execute();
  renderWeekOverWeekChart(data.ids);
  renderTopBrowsersChart(data.ids);
  renderTopCountriesChart(data.ids);

  setTimeout(function() {
    var list = document.getElementsByTagName("tr")[0];
    list.getElementsByTagName("th")[0].innerHTML = "Pagina's";
    list.getElementsByTagName("th")[1].innerHTML = "Paginaweergaven";
  }, 500); 
 }

这将创建一个名为update的新函数,该函数接受一个名为data的参数。感谢hoisting,如果您想在任何地方之前或之后使用它,那将无关紧要,因为它会被拉动"到顶部。

接下来,您可以像{<1}}处理程序一样使用ready处理程序中的函数

gapi.analytics.ready(function() {
  viewSelector.on('viewChange', update);
});

由于.on([event], [callback])接受一个函数作为第二个参数,你可以在那里提供一个函数引用。你的函数在别处被技术声明并不重要,因为它仍然会用相同的参数调用。同样,如果您将update替换为alert,则会提供alert()的引用,以便您收到包含数据的提醒。

有了它,你可以在另一段代码中调用相同的函数。

对于任何使用回调的地方都是如此,包括setTimeout - 您可以只提供一个函数引用,然后调用它。在内部,这些类型的函数几乎总是像callback()callback(someData)那样,偶尔callback.call(/* parameters */) where **callback** is the passed in argument. Whether you define that argument as you are calling the function, e.g., selector.on(&#34; click&#34;,function(){/ * code * /})`或单独的,例如,

function clickHandler() { /* code */ }
selector.on("click", clickHandler)

很重要。

话虽如此,你是否想要全局功能是另一回事。除非两段代码都在同一个地方,否则全局函数可能是最简单的方法。当然,您可以命名应用程序使用的任何名称,这可以部分避免全球污染。不完全,但有时你只需要在window下生活,如果你有多个文件,在这种情况下,你可以在那里定义你自己的小角落:window.myApp = window.myApp || {}会创建一个新对象它可以作为命名空间,因此您可以执行myApp.update = function(data) { /* code */ }之类的操作,从而共享该代码。

如果你的两段代码确实在一个文件中,那么你只需要使用var update = function(data) { /* code */ }在两者之外创建函数,然后以完全相同的方式将它交给每个,因为update仍然是将成为函数引用,但是,如果将其赋值给变量,则不会将其添加到全局名称空间(也不会添加到声明中)。