从函数内部声明一个全局变量
Declare a global variable from inside a function
我有以下代码,使用他们的Javascript API跟踪我的页面中嵌入的Youtube视频是必要的:
function onYouTubePlayerReady(playerId) {
var youtubeplayer = document.getElementById('youtubeplayer');
youtubeplayer.addEventListener("onStateChange", "onytplayerStateChange");
youtubeplayer.setPlaybackQuality('large');
}
function onytplayerStateChange(newState) {
//Make it autoplay on page load
if (newState == -1) {
youtubeplayer.playVideo();
}
var tiempo = youtubeplayer.getCurrentTime();
//Rounds to 2 decimals
var tiempo = Math.round(tiempo*100)/100;
alert(tiempo);
}
(与 Youtube API 相关的细节并不重要,但如果你好奇,它们在我之前的问题Youtube Javascript API:在IE中不起作用(。
现在,我的问题是onYoutubePlayerReady((函数声明了"youtubeplayer",这是对DOM对象的引用,我也需要从另一个函数onytplayerstateChange((访问该变量...但是"YouTubeplayer"被声明为局部变量。这适用于IE 8,Safari...,但不适用于Firefox 12。当然,我可以通过以下方式获得对"youtubeplayer"的引用,而无需"var":
youtubeplayer = document.getElementById('youtubeplayer');
事实上,这就是它在 Youtube 的示例代码中的样子,但如果我这样写,代码在 IE 8 中不起作用(虽然它在 Firefox 12 中确实有效;有关更多详细信息,请参阅我之前的问题(。
。所有这些都让我想到:有没有办法从函数内部声明一个全局变量(如上面的"youtubeplayer"(,以便其他函数也可以访问它?适用于所有浏览器的东西?
声明全局的另一种方法是将其创建为全局"窗口"对象的额外属性 - 也是如此
window.youtubeplayer = document.getElementById('youtubeplayer');
这应该可供页面上的任何其他内容访问。 所以你的完整代码看起来像这样;
function onYouTubePlayerReady(playerId) {
window.youtubeplayer = document.getElementById('youtubeplayer');
window.youtubeplayer.addEventListener("onStateChange", "onytplayerStateChange");
window.youtubeplayer.setPlaybackQuality('large');
}
function onytplayerStateChange(newState) {
//Make it autoplay on page load
if (newState == -1) {
window.youtubeplayer.playVideo();
}
var tiempo = window.youtubeplayer.getCurrentTime();
//Rounds to 2 decimals
var tiempo = Math.round(tiempo*100)/100;
alert(tiempo);
}
无需将对 onytplayerStateChange 函数的字符串引用传递给事件侦听器,您可以在 ready 函数中创建事件处理程序并直接传入,如下所示:
function onYouTubePlayerReady(playerId) {
var youtubeplayer = document.getElementById('youtubeplayer');
var stateChangeHandler = function (newState) {
//Make it autoplay on page load
if (newState == -1) {
youtubeplayer.playVideo();
}
var tiempo = youtubeplayer.getCurrentTime();
//Rounds to 2 decimals
var tiempo = Math.round(tiempo*100)/100;
alert(tiempo);
};
youtubeplayer.addEventListener("onStateChange", stateChangeHandler);
youtubeplayer.setPlaybackQuality('large');
}
甚至直接传入匿名函数:
function onYouTubePlayerReady(playerId) {
var youtubeplayer = document.getElementById('youtubeplayer');
youtubeplayer.addEventListener("onStateChange", function (newState) {
//Make it autoplay on page load
if (newState == -1) {
youtubeplayer.playVideo();
}
var tiempo = youtubeplayer.getCurrentTime();
//Rounds to 2 decimals
var tiempo = Math.round(tiempo*100)/100;
alert(tiempo);
});
youtubeplayer.setPlaybackQuality('large');
}
这保留了"onYouTubePlayerReady"函数中youtubeplayer变量的作用域,并绕过了建立全局变量的需要。
- 使用 grunt 在 javascript 文件中“嵌入”一个全局变量
- HTML元素在JavaScript中表示为一个全局变量,How
- 这是一个全局变量吗?
- CoffeeScript 在 'for v in values' 中创建一个全局变量 'v',导致事件中的错误引用
- 在 Jquery 中为语言切换器分配一个全局变量
- 从函数内部声明一个全局变量
- 在 TypeScript 中使用外部模块声明一个全局变量
- 我是否正在创建一个全局变量
- 将 React 模板放在一个全局变量的属性中
- AJAX和一个全局变量不起作用,我错了吗
- 多个局部变量声明与一个全局变量声明
- 将ajax响应分配给一个全局变量
- 我应该使用Javascript或PHP设置一个全局变量来唯一标识web应用程序中的每个页面吗
- 声明一个没有'var'让它成为一个全局变量或者只是改变它的值
- 用JavaScript创建一个全局变量
- 如何使用一个全局变量,这是可见的HTML/Razor和javascript都在同一个页面上
- 为什么定义在函数内部的x在我没有声明它为变量的情况下变成了一个全局变量?
- 如何使一个全局变量有不同的值与每个html页面
- 从.php页面获取JSON数据并将其存储在一个全局变量中
- 我如何赋值给一个全局变量在node.js