【问题标题】:Why am I able to define same function twice in javascript?为什么我可以在 javascript 中定义两次相同的函数?
【发布时间】:2016-03-02 15:15:42
【问题描述】:

我有一个 javascript 文件,我在其中编写了一堆 jquery 函数。我有一个返回角度范围的函数。我发现如果我要编写两次相同的函数,代码仍然会执行。

function getngScope()
{
    alert(2);
    return angular.element($('#data-area')).scope();
}

function getngScope()
{
    alert(1);
    return angular.element($('#data-area')).scope();
}

当我调用getngScope() 时,我收到“1”警报并返回范围。为什么会有这种行为?

【问题讨论】:

  • 当你写第二个时,它有点取代第一个,所以这就是它发生的原因
  • 您正在做的事情在 JavaScript 中不会被视为错误。换句话说,这并不违反语言中的任何规则。
  • 你为什么要这么做?你不应该那样做!
  • @Anarakanitach:我想这样做是为了看到一个错误被抛出,而当它没有抛出时,我很惊讶。所以那里:)
  • @Pointy:我没有意识到重复的函数定义在 JS 中不被视为错误。感谢您的评论。

标签: javascript function overwrite


【解决方案1】:

很明显,您不应该定义相同的函数两次。但是,当您这样做时,后一个定义是唯一适用的 1。尽量不要那样做。除了给两个函数赋予相同的名称之外,找到另一种方法。

【讨论】:

  • 我从来没有意识到写一个新的函数会覆盖第一个函数,在 JS 中!
  • 不只是在 JS 中,几乎是我接触过的所有语言。你为什么要这样做呢?也许我可以为你推荐另一种方法。
  • @Y2H 好吧,Java 和 C 肯定会抱怨在同一上下文中具有相同名称的两个函数。
  • 有一段时间没用过 C 但 Java 不会了。
  • @Pointy 不,他们不会。
【解决方案2】:

函数是内存栈中的数据,所以当你定义另一个同名的函数时,它会覆盖前一个。

【讨论】:

    【解决方案3】:

    第二个函数替​​换了第一个函数,你总是可以通过修改函数的名称来改变它,如果不是,你可以添加多个参数..如果需要的话......以及对这种行为的解释,不像其他编程语言 javascript 在执行时不会返回任何错误。所以你可以假设它只是在执行期间通过覆盖函数来纠正自己。

    【讨论】:

      【解决方案4】:

      对象的第二个定义覆盖第一个。通常,对象的最后一个定义会覆盖所有之前的定义。

      JavaScript 中的函数是对象:

      (function () {}) instanceof Object === true
      

      当您创建一个新的全局函数f 时,如果您创建一个函数,则相当于在window 对象中创建一个属性并将函数定义分配给该变量:

      function myFun() { console.log('my function') };
      

      然后检查window.myFun的值你会发现它和myFun的功能一样:

      window.myFun === myFun // true
      

      您还会注意到修改window.myFun 会更改/覆盖myFun

      例如

      function myFun() { console.log('myFun') };
      myFun(); // Prints: 'myFun'
      
      // Overwrite myFun
      window.myFun = function () { console.log('NoFun') };
      myFun(); // Prints: 'NoFun'

      函数的第二个定义优先。

      我建议您阅读 Crockford 的“JavaScript 中的函数:优秀部分”一章。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-26
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-08
        相关资源
        最近更新 更多