获取其他函数内部变量的值 javascript

get the value of variable inside other function javascript

我在 "onPlayerReady" 中有一个变量 "mail",其中我有电子邮件地址,我想在 "onPlayerStateChange" 中调用这个变量,以便我可以将值传递给 'input.php' 页面将其保存到数据库中。

$(function(){
  var youtubePlayer;
  var myWindow = window;
  var vid_id='ha48nSKLLh8';
  onYouTubeIframeAPIReady = function(){
   youtubePlayer = new YT.Player('youtube', {
     height: '390',
     width: '640',
     videoId: vid_id,
     events: {
       'onReady': onPlayerReady,
       'onStateChange': onPlayerStateChange
     }
   });
   }

  onPlayerReady = function(event) {
   event.target.pauseVideo();
   var mail=prompt('email:'); //this is the variable mail i am talking about i want the value if this variable inside onPlayerStateChange


   };


  onPlayerStateChange = function(event) {

   if (event.data == 1) {
       var tm = youtubePlayer.getCurrentTime();
       var st = youtubePlayer.getPlayerState();
       //$("#status1").text(tm);    


       $("#status1").text(st);
       $.ajax({
        type: 'POST',
        url: 'input.php',
        data:{ tm: tm, vid_id: vid_id,mail:mail},   
        success:function(html){
           alert(done);

        }
    });

       //$("#status1").text(tm);

     $("#status").text("Playing!");
     myWindow.focus();
     myWindow.onblur = function() {
       $("#status").text("You went away!");
       youtubePlayer.stopVideo();
     };
   }

  };

  youtubeplayer.bind('play',function(){
      youtubeplayer.time(60);
      return this.unbind;
  });
})

如果有任何其他方法可以保存在 "onPlayerReady" 中输入的电子邮件,请帮助我或建议我。 提前致谢!

如果您在 $(function() 之外声明 mail 变量,它将是一个 global variable 并且可以被所有 Javascript 代码访问。例如

var mail = "";
$(function(){
    ...

    onPlayerReady = function(event) {
        event.target.pauseVideo();
        mail=prompt('email:'); // remove the var here
    };

事实上,正如@nikhil 指出的那样,您甚至可以将它放在外部 function() 中(只要它在 onPlayerReady 函数之外)。

我建议在你的闭包中声明 mail 变量,如果没有必要,不要声明为全局变量,即:

$(function(){
    var mail = null; // not a global, but available in the entire function scope.
    var youtubePlayer;
    var myWindow = window;
    ...

细微差别是现在没有其他代码可以潜在地覆盖 mail 变量(反之亦然),因此没有命名冲突。 最好在 javascript.

中尽可能避免全局变量

请确保不要在 onPlayerReady() 中重新定义您的 mail 变量:

onPlayerReady = function(event) {
   event.target.pauseVideo();
   mail = prompt('email:'); // Only store the prompt input (i.e no var).
};

通过这种方式,您仍然可以在 ajax 请求中访问 mail 变量,而不会出现上述缺点。

也可以参考这个post