[英]Call function within another in Javascript
我有以下脚本:
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(function() {}
?
重要的是我不能在全球范围内制作它,因为它必须位于 gapi.analytics.ready() 内。
移动函数声明真的很简单
function update (data) {
// same as existing code
}
gapi.analytics.ready(function() {
viewSelector.on('viewChange', update );
});
并在您在其他函数中调用它时传递所需的数据
function datumwissel( datumbtn ) {
if ( datumbtn.className == 'maand' ) {
..........
update(datumbtn);
}.......
重要的是我不能在全球范围内制作它,因为它必须位于 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
参数。 多亏了提升,它在您想要使用它的任何地方之前或之后都无关紧要,因为它会被有效地“拉”到顶部。
接下来,您可以像这样在ready
处理程序中使用该函数:
gapi.analytics.ready(function() {
viewSelector.on('viewChange', update);
});
由于.on(events, handler)
接受一个函数作为第二个参数,你可以在那里提供一个函数引用。 您的函数在技术上在其他地方声明并不重要,因为它仍然会使用相同的参数被调用。 同样,如果您用alert
替换update
,您将提供对window.alert
的引用,因此您将收到带有数据的警报。
这样,您就可以在另一段代码中调用相同的函数。
对于任何使用回调的地方都是如此,包括setTimeout
- 你可以只给出一个函数引用,它就会被调用。 在内部,这些类型的函数几乎总是做类似callback()
或callback(someData)
,偶尔callback.call(/* parameters */)
其中callback
是传入的参数。 是在调用函数时定义该参数,例如selector.on("click", function() {/* code */})
还是单独定义,例如,
function clickHandler() { /* code */ }
selector.on("click", clickHandler)
无关紧要。
话虽如此,您是否想要全局函数是另一回事。 除非两段代码在同一个地方,否则全局函数可能是最简单的方法。 你也可以命名你的应用程序使用的任何东西,这将部分避免全局污染。 不完全,但有时如果您有多个文件,您只需要在window
下放置一些东西,在这种情况下,您可以在那里定义自己的小角落: window.myApp = window.myApp || {}
window.myApp = window.myApp || {}
将创建一个可用作命名空间的新对象,因此您将能够执行诸如myApp.update = function(data) { /* code */ }
,从而共享该代码。
如果您的两段代码确实在一个文件中,那么您只需要在两者之外使用var update = function(data) { /* code */ }
创建函数,然后以完全相同的方式将其传递给每个文件,因为update
仍然是一个函数引用,但是,如果分配给一个变量,它不会被添加到全局命名空间(也不会提升声明)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.