在Javascript中识别重复的函数

时间:2012-09-11 02:58:56

标签: javascript

是否可以在Javascript中检测重复的功能(在某些情况下可能会意外写入)?在谷歌浏览器中,

printLah(); //this prints "Haha" for some reason, without even printing an error message in the Javascript console!
function printLah(){
    alert("Hahah!");
}


function printLah(){
    alert("Haha");
}

Here it is on JSfiddle.

2 个答案:

答案 0 :(得分:9)

简短的回答是,不,不是

这是javascript的工作原理。函数名称只是一个分配了函数的变量。例如:

function foo () {
    alert('foo!');
}

foo = 1;

foo();

上面的代码会产生错误,因为数字不是函数!函数名和变量名之间没有区别。事实上,定义函数的另一种方法与您定义变量的方式完全相同:

var foo = function () {
              alert('foo!');
          }

这是因为这个函数作为第一类对象的行为,javascript无法阻止重新分配,否则你无法重新分配变量(另一方面,纯函数语言不允许不允许重新赋值)。


解决方法和最佳做法:

这就是人们一直说你不应该在javascript中定义太多全局变量的原因。这包括功能。否则它可能会与其他人的代码发生意外冲突。

javascript中有两个强大的功能可以缓解此问题:对象闭包

因为javascript支持对象,所以你应该使用面向对象的编程来限制程序中的全局变量。与传统的OOP不同,javascript在将对象用作集合或命名空间时效果更好。这是因为javascript没有文件范围,一切都是全局的。

这并不意味着您不应该创建像传统OOP那样封装较小问题的较小对象。它只是意味着,如果可以,您应该在单个父对象中包含所有对象。我并不是指在这里继承,我的意思是在一种关系中。看看像jQuery和Raphael这样的流行图书馆。它们只将一个对象导出到全局范围,以避免与其他人的代码冲突。

但是,这并不能真正保护人们不再重新分配你的对象(因为它们毕竟是变量)。例如,您可以通过在HTML文件的顶部执行此操作轻松破解jQuery,然后其他javascript有机会运行:

jQuery = null;

保护代码不被篡改的方法是使用闭包。第三方代码无法访问您在闭包内运行的任何代码。只要你避免使用全局变量。

答案 1 :(得分:2)

为了在slebetman的答案中添加一个可能的检查,您可以在声明变量或函数之前使用以下内容检查是否存在。

if (typeof(functionName) == 'undefined') {
    functionName = function() { 
        // add code here
    }
}

再一次,你做这个检查的原因是因为你想/需要把东西放在全局范围内,即使它通常不需要。不使用var将其隐式置于全局范围内。

相关问题