了解将函数作为JavaScript变量传递时变量会发生什么

时间:2015-10-30 19:45:51

标签: javascript

行。我试图理解JavaScript中的闭包。 我有一个功能,但我看到不一致的结果。传递url参数时,除非在回调中完成,否则它很好。我认为闭包会在函数中保留该值。

ABC.print = function (reportId, format, reportTitle) {
        alert("Coming in=" + format);  // Always has right value.

        var url = 'Main/MyModule/Print?reportId=' + reportId;
        url += '&format=' + format;
        url += '&reportTitle=' + reportTitle;   

        function printWindow(urlString) {
           window.open(urlString, 'Print', "toolbar=no,menubar=no,status=no");
        };    

        // What is the difference between?
   if (someCondition)
   {
      // Variables in url are not current, they retain first time value only.
      SomeFunction("Text", "Text 2", function () { printWindow(url); });
   }
   else {
      // Variables are always current
      printWindow();
   }
};

1 个答案:

答案 0 :(得分:1)

我怀疑你注释掉的部分:

// Actually some logic but to simplify...

变量url的值已更改。

当调用函数printWindow()时,调用此时将采用url 的值(而不是url的值在定义函数时。

范围主题可能会搞砸:您的var url=...仅存在于函数ABC.print中。只要程序执行在ABC.print内,var就会有可预测的结果。但是,只要将函数printWindow()作为回调函数传递给其他地方,您就不再位于ABC.print范围内。因此url值未定义,或者最不稳定/不可预测。

要解决这个问题,你可以给变量url全局范围:在任何函数之外的某个地方定义它,以便它随处可用。

// global scope
var url;

ABC.print = function (reportId, format, reportTitle) {
  alert("Coming in=" + format);

  // give the global variable content here
  url = 'Main/MediaReach/Print?reportId=' + reportId;
  url += '&format=' + format;
  url += '&reportTitle=' + reportTitle;   

  printWindow = function () {
    alert("ulr = " + url);
    window.open(url, 'Print', "toolbar=no,menubar=no,status=no");
  };

  // Actually some logic but to simplify...
  printWindow();

  // passing printWindow as callback
  doSomething('myParam',printWindow);
};