繁体   English   中英

如何在不使用参数的情况下在javascript中传递变量?

[英]How can I pass variable in javascript without using parameter?

我有一个函数用于从文本文件获取数据并在另一个函数中发出警报。

  var library_name; // Global Variable

  function getLibraryName(){
         jQuery.get('stream.txt', function(data) {
           library_name = data.toString().substring(17,data.length);
         });
  }

 function saveFeedback() {
    alert(library_name);
  }

调用saveFeedback时,它将警告library_name

我试图把它放在这样的相同功能中

function saveFeedback() {
    jQuery.get('stream.txt', function(data) {
         library_name = data.toString().substring(17,data.length);
    });

    alert(library_name);
}

但仍然在控制台中说undefined

如何解决呢? 不使用参数,因为必须从其他地方调用saveFeedback函数。

.get的第二个参数在获取完成时被调用。 您说的是,“获取stream.txt并在完成时执行此功能”。 获取完成后,以下调用saveFeedback:

function getLibraryName(){
         jQuery.get('stream.txt', function(data) {
           library_name = data.toString().substring(17,data.length);
           saveFeedback();
         });
  }

由于get是异步的,因此您的解释器将在saveFeedback success函数之前实例化saveFeedback函数(尽管某些健全性检查器(如JSLint)可能希望您在getLibraryName之前定义saveFeedback

您应该在$ .get(data)回调中使用saveFeedback()函数,因为它是异步请求,并且您不知道何时完成。

您可以创建一个隐藏的输入字段,并使用$ .data()将数据附加到该字段。

例如:

  function getLibraryName(){
         jQuery.get('stream.txt', function(data) {
           var library_name = data.toString().substring(17,data.length);
           $('#myHiddenField').data('library_name', library_name);
         });
  }

 function saveFeedback() {
    alert($('#myHiddenField').data('library_name'));
  }

jQuery get启动一个异步调用。 异步意味着从中返回的结果将在稍后返回……可能会在很短的时间之后,可能会在几秒钟后返回。 启动此呼叫后,代码将立即进入下一行,这是您的警报。 该警报在异步调用返回之前发生,因此变量当然仍然是undefined -尚未设置。

解决问题的一种方法可能是告诉jQuery使调用同步。 但这是错误的答案,因为它将在调用发生时阻止浏览器响应用户交互。 相反,您需要调整对异步调用的看法。 基本概念是,不必像常规的程序配方那样具有逐步执行功能的大功能(执行步骤1,步骤2,然后步骤3),而必须设置两个不同的配方或代码段:一种启动ajax调用,然后退出 ,另一种响应ajax调用的结果。

现在,您已经具有两个功能。 由于我已经解释的原因,您无法将它们组合在一起。 但是,您可以将它们链接起来,也可以将它们封装在另一个内部:

var library_name;

function saveFeedback() {
   alert(library_name);
}

function getLibraryName(){
   jQuery.get('stream.txt', function(data) {
      library_name = data.toString().substring(17 ,data.length);
      saveFeedback(); // this chains the two functions together
   });
}

甚至更好:

var library_name;

function saveFeedback() {
   alert(library_name);
}

function receiveLibraryName(data) {
   library_name = data.toString().substring(17, data.length);
   saveFeedback();
   // additional statements here after saving
}

function getLibraryName(){
   jQuery.get('stream.txt', receiveLibraryName);
}

关键是您不能像往常一样在getLibraryName函数中继续下getLibraryName语句。 在ajax调用之后,您希望采取的步骤必须在另一个函数内部:在回调函数本身中,或者在从回调函数调用的另一个函数中。

尝试以下代码:

var library_name;
function getLibraryName(){
     jQuery.get('stream.txt', function(data) {
       let lbName= data.toString().substring(17,data.length);
       saveFeedback(lbName);
  });
}

function saveFeedback(lbName) {
   library_name = lbName; //If you are using library_name in other code
   alert(library_name);
}

您必须在jquery.get之前定义一次library_name。 因为如果jquery.get不起作用,则在调用警报时将不会创建library_name。 请添加var library_name; 作为saveFeedback()的第一行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM