行。我试图理解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();
}
};
答案 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);
};