老师,我想问下我这样写的话,四个运算函数为什么报错?

老师,我想问下我这样写的话,四个运算函数为什么报错?

 <div id="calculator">
        <input id="num1" type="text" ></input>
        <span id="calcu">-</span>
        <input id="num2" type="text" ></input>
        <span>=</span>
        <span id="result">3</span>
    </div>
    <button id="add">+</button>
    <button id="subtract">-</button>
    <button id="multipy">*</button>
    <button id="devide">÷</button>

<script type="text/javascript">
  function idName(obj){
        return document.getElementById(obj)
  };

  var add=idName("add"),
      subtract=idName("subtract"),
      multipy=idName("multipy"),
      devide=idName("devide"),
      calcu=idName("calcu"),
      result=idName("result")
      console.log(result)
      function add(n,m){
           return parseInt(n)+parseInt(m);
      }
      function subtract(n,m){
             return parseInt(n)-parseInt(m);
      }
      function multipy(n,m){
             return parseInt(n)*parseInt(m);
      }
      function devide(n,m){
             return parseInt(n)/parseInt(m);
      }
  function caculate(n,m,calcu){
       if(calcu=="+"){
             return add(n,m)
       }else if(calcu=="-"){
          return subtract(n,m)
       }else if(calcu=="*"){
             return multipy(n,m)
       }else if(calcu=="÷"){
             return  devide(n,m)
       }else{
             return "error";
       }
  };

 add.onclick=function(){
      var num1=idName("num1").value,
          num2=idName("num2").value
     console.log("+");
     result.innerHTML=caculate(num1,num2,this.innerHTML);
     calcu.innerHTML=this.innerHTML;
     console.log(caculate(num1,num2,this.innerHTML));
 };
 //console.log(add.onclick)
 multipy.onclick=function(){
     var num1=idName("num1").value,
        num2=idName("num2").value
     console.log("-");
     result.innerHTML=caculate(num1,num2,this.innerHTML)
     calcu.innerHTML=this.innerHTML;
 };
 subtract.onclick=function(){
     var num1=idName("num1").value,
        num2=idName("num2").value
     console.log("*");
     result.innerHTML=caculate(num1,num2,this.innerHTML)
     calcu.innerHTML=this.innerHTML;
 };
 devide.onclick=function(){
     var num1=idName("num1").value,
        num2=idName("num2").value
     console.log("÷");
     result.innerHTML=caculate(num1,num2,this.innerHTML)
     calcu.innerHTML=this.innerHTML;
 };
</script>

我写的加减乘除四个是全局函数,为什么在caculate()里面执行时,报错啊?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕星星 2018-09-11 15:58:55

之前的代码是变量名与函数名重复导致的,把函数名称修改一下就可以了。

http://img1.sycdn.imooc.com//climg/5b9775b60001a81505720705.jpg

自己测试下。

  • 提问者 skynowyang #1
    确实如此,但是老师之前讲浏览器预解析的时候,如果变量和函数同名,会将同名变量解析为函数,函数名和函数名相同的时候会解析后面定义的函数,在这里为什么不自动将add解析为函数呢?
    2018-09-11 16:06:20
  • 好帮手慕星星 回复 提问者 skynowyang #2
    预解析的时候,变量名与函数名重复的情况下,会把整个函数体给提升保存,但是执行代码时,又把数值赋给了这个变量,这时候add就不是函数了。可以看一个预解析的教辅哦:https://clfile.imooc.com/class/assist/499/6616789/dwf9fsp0re/%E8%A7%A3%E6%9E%90%E6%9C%BA%E5%88%B6.pdf
    2018-09-11 16:31:07
好帮手慕星星 2018-09-11 11:49:31

建议不要在caculate函数中返回计算函数被调用之后的,可以返回这个计算函数,参考:

http://img1.sycdn.imooc.com//climg/5b973b1d00014e5708900739.jpg

然后这样调用:

http://img1.sycdn.imooc.com//climg/5b973b3b0001bc2908460216.jpg

自己测试下,祝学习愉快~~

  • 提问者 skynowyang #1
    为什么呢?
    2018-09-11 12:04:01
  • 好帮手慕星星 回复 提问者 skynowyang #2
    你之前那样是可以的呢,把函数名更换一个就可以了,要不然调用的时候,回合上面的变量名冲突,自己试一下。
    2018-09-11 13:10:32
  • 提问者 skynowyang 回复 好帮手慕星星 #3
    我之前那样我测试的时候本地报错,函数undifiend,是我名字写错了么?
    2018-09-11 15:12:25
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
进击JavaScript核心 2018
  • 参与学习       466    人
  • 提交作业       74    份
  • 解答问题       635    个

JavaScript不仅能实现静态页面到动态特效的转变,还能完成数据的动态交互,但是关于js到底功能有多强大,大家还是有所期待的,本路径将带你深入到js中,一一揭开JavaScript的神秘面纱。

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师