Javascript 我的函数和调用者有什么问题?带功能的按钮提示

Javascript 我的函数和调用者有什么问题?带功能的按钮提示,javascript,function,leaflet,Javascript,Function,Leaflet,我正在上一堂网络地图课,这项作业真是让我大吃一惊。我对这门课完全陌生,现在才学了三个星期JS之类的东西。因此,任务是有一张地图,上面有三个城市的标记,页面上有一个按钮,当用户点击它时,他们会键入英里或公里。基于该输入,函数应该能够显示基于公里或英里的人口密度(取决于他们输入的内容)。但现在它给了我一个错误信息,单位是未定义的。我给我的教授发了电子邮件,他含糊其辞,基本上说单位和我的单位来电者是“随机”安排的 我只是在赋值的调用方和函数部分中包含代码。地图部分工作正常 var caller = m

我正在上一堂网络地图课,这项作业真是让我大吃一惊。我对这门课完全陌生,现在才学了三个星期JS之类的东西。因此,任务是有一张地图,上面有三个城市的标记,页面上有一个按钮,当用户点击它时,他们会键入英里或公里。基于该输入,函数应该能够显示基于公里或英里的人口密度(取决于他们输入的内容)。但现在它给了我一个错误信息,单位是未定义的。我给我的教授发了电子邮件,他含糊其辞,基本上说单位和我的单位来电者是“随机”安排的

我只是在赋值的调用方和函数部分中包含代码。地图部分工作正常

var caller = mapCities(units)  

var button = document.getElementById("map-cities"); 
   button.addEventListener("click", function() {

       do {
           var units = prompt('Enter the units for calculating density', 'Enter "miles" or "km"');
       } while (units != "miles" && units != "km");

       mapCities(units);

  });



  function mapCities(units) { 

      var fortWayneDensity = CalcPopDensity(units, fortWayne.pop, fortWayne.areaMi, fortWayne.areaKm)
      var indyDensity = CalcPopDensity(units, indy.pop, indy.areaMi, indy.areaKm)
      var southBendDensity = CalcPopDensity(units, southBend.pop, southBend.areaMi, southBend.areaKm)
      // A density variable for each city representes a caller which sends down three pieces of information - units that was passed in through the MapCities caller and the pop and area from the objects you created above


      var fortWaynePopup = "<b>" + "Fort Wayne" + "</b><br>" +
              "<b>Density</b>: "+fortWayneDensity.toLocaleString()+" people per square " + units;
           var fortWayneMarker =
               L.marker(fortWayne.coord)
              .addTo(map)
              .bindPopup(fortWaynePopup);

      var indyPopup = "<b>" + "Indianapolis" + "</b><br>" +
              "<b>Density</b>: "+indyDensity.toLocaleString()+" people per square " + units;
           var indyMarker =
               L.marker(indy.coord)
              .addTo(map)
              .bindPopup(indyPopup);

      var southBendPopup = "<b>" + "South Bend" + "</b><br>" +
              "<b>Density</b>: "+southBendDensity.toLocaleString()+" people per square " + units;
           var southBendMarker =
               L.marker(southBend.coord)
              .addTo(map)
              .bindPopup(southBendPopup);


  }


   function CalcPopDensity (units, pop, areami, areakm){
       var choice = units;
       if (units = km) {
           pop/areakm}
       else {
           pop/areami}
       return choice
   }
var caller=mapCities(单位)
var button=document.getElementById(“地图城市”);
addEventListener(“单击”,函数(){
做{
var units=提示符('输入计算密度的单位','输入“英里”或“公里”);
}而(单位=英里和单位=公里);
地图城市(单位);
});
函数映射城市(单位){
var fortWayneDensity=CalcOpDensity(单位:fortWayne.pop、fortWayne.areaMi、fortWayne.areaKm)
var indyDensity=CalcPopDensity(单位:印地·波普、印地·面积米、印地·面积公里)
var southBendDensity=CalcPopDensity(单位:southBend.pop、southBend.areaMi、southBend.areaKm)
//每个城市的密度变量表示一个调用者,该调用者向下发送三条信息-通过MapCities调用者传入的单位以及上面创建的对象的pop和区域
var fortWaynePopup=“”+“韦恩堡”+“
”+ “密度:”+fortWayneDensity.tolocalesting()+“每平方米人数”+单位; var fortWayneMarker= L.马克(福特韦恩·库德) .addTo(地图) .bindPopup(fortWaynePopup); var indyPopup=“”+“印第安纳波利斯”+“
”+ “密度:”+indyDensity.tolocalesting()+“每平方米人数”+单位; var indyMarker= L.marker(印第库德) .addTo(地图) .bindPopup(indyPopup); var southBendPopup=“”+“南弯”+“
”+ “密度:”+南部弯曲度。toLocaleString()+“每平方米人数”+单位; var southBendMarker= L.marker(南本德协调公司) .addTo(地图) .bindPopup(南奔普); } 功能计算密度(单位、pop、面积mi、面积km){ var选择=单位; 如果(单位=公里){ pop/km} 否则{ pop/ARAMI} 返回选择 }
我认为问题在于你试图超越:

var caller = mapCities(units)
但你后来申报了单位:

var units = prompt('Enter the units for calculating density', 'Enter "miles" or "km"');
如果删除第一行代码,它应该可以工作,因为您已经在事件侦听器中执行了mapCities函数

button.addEventListener("click", function() {

   do {
       var units = prompt('Enter the units for calculating density', 'Enter "miles" or "km"');
   } while (units != "miles" && units != "km");

   mapCities(units);
}))

如果确实希望在调用者变量中保留对mapCities的引用,则应采用以下方法:

var caller = mapCities

因为如果使用括号,它将执行函数,这样它将保留对函数的引用。

为什么在代码的第一行调用mapCities?一旦有人点击按钮,它就会被调用。我删除了你告诉我要删除的内容,它给了我一个错误,因为km未定义。但我发现,我需要在if-else语句中将km转换为“km”。现在,它起作用了!谢谢,互联网。我发现了另一个问题,我在上一个函数中的返回语句是返回英里或公里,而不是pop密度,我就是这样解决的。。函数CalcPopDensity(units,pop,areami,areakm){var choice=units;if(units='km'){return pop/areakm}else{return pop/areami}