为什么我能在javascript中两次定义相同的功能?

时间:2015-11-28 17:03:29

标签: javascript function overwrite

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

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

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

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

4 个答案:

答案 0 :(得分:2)

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

JavaScript中的函数是对象:

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

当你创建一个新的全局函数f时,它等同于在window对象中创建一个属性并将函数定义赋值给该变量,如果你创建一个函数:

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

然后检查window.myFun的值,您会注意到它与myFun的功能相同:

window.myFun === myFun // true

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

E.g。

function myFun() { console.log('myFun') };
myFun(); // Prints: 'myFun'

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

该函数的第二个定义优先。

我建议你阅读关于JavaScript函数的章节:Crockford的好部分。

答案 1 :(得分:1)

函数是内存堆栈中的数据,因此当您定义另一个具有相同名称的函数时,它将覆盖前一个函数。

答案 2 :(得分:0)

很明显,你并不是要两次定义相同的功能。但是,当您这样做时,后一个定义是唯一适用的定义。尽量不这样做。找到另外一种方法,而不是给两个函数同名。

答案 3 :(得分:0)

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