Javascript对象成员

时间:2015-10-01 18:36:59

标签: javascript

var math = {

    Factorial:function(n) {
        if (n == 0) {
            return 1;
        }
        return n * Factorial(n - 1);
    },

    CalculateFactorial:function() {
        var myValue = document.getElementById('myTextBox').value;
        if (myValue.length == 0) {
            alert("Please input the correct value!");
            return;
        }
        var result = Factorial(myValue);
        document.getElementById('title').innerHTML = result;
    }

}

大家好。新的JavaScript和测试不同的东西,来自C#语言的东西是相同但不同的。

我正在尝试做某事但没有成功。

将上面的脚本附加到一个简单的html按钮,尝试调用CalculateFactorial,math.CalculateFactorial();但是奇怪的是,CalculateFactorial()实际上并没有看到Factorial()方法。但在数学对象中,我可以看到两种方法。奇怪的。

“JavaScript运行时错误:'Factorial'未定义”

3 个答案:

答案 0 :(得分:1)

JavaScript中的一个好习惯是命名所有函数,即使将它们分配给变量或使用它们像object的属性。在您的情况下,只需为Factorial函数命名,如下所示:

Factorial:function factorial(n)
{
    if (n == 0)
    {
        return 1;
    }

    return n * factorial(n - 1);
},

对于Factorial函数中未看到CalculateFactorial的问题,请在调用时使用this.Factorial

答案 1 :(得分:0)

这应该可以解决问题......如果你想让Factorial成为一个内部唯一的函数(只是暴露的CalculateFactorial的一个实用程序),那么你可以这样做:

@Async

这里更深层次的设计问题是这不是特别可重用的javascript。你应该考虑将CalculateFactorial()从数学对象中拉出来并放入它自己的处理程序......可能是一个点击处理程序就像这样:

var math = new function() {
      var $this = this;

      var Factorial = function(n) {
          if (n == 0) {
              return 1;
          }

          return n * Factorial(n - 1);
      }

      $this.CalculateFactorial = function() {
          var myValue = document.getElementById('myTextBox').value;

          if (myValue.length == 0) {
              alert("Please input the correct value!");
              return;
          }
          var result = Factorial(myValue);
          document.getElementById('title').innerHTML = result;

      }

  }

答案 2 :(得分:0)

这种情况发生的原因是math方法是ReferenceError对象的一部分,并且它不会驻留在全局范围内。当您尝试直接调用它时,解析器将尝试在全局范围内找到该方法,然后,它将抛出this

由于您在对象内部使用了该方法,因此可以使用Factorial关键字,因为它会查看对象的上下文并找到方法Factorial

调用math.Factorial方法的另一种方法是使用对象,例如:var math = { Factorial: function(n) { return n === 0 ? 1 : n * this.Factorial(n - 1); }, CalculateFactorial: function(txt) { document.getElementById('title').innerHTML = this.Factorial(txt.value); } }; document.getElementById('myTextBox').addEventListener('input', function() { math.CalculateFactorial(this); });

看一下下面的例子:



<input type="text" id="myTextBox" placeholder="Fatorial">
<div id="title"></div>
&#13;
{{1}}
&#13;
&#13;
&#13;