3

是否可以检测 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");
}

这是在 JSfiddle 上。

4

3 回答 3

9

简短的回答是,不,不是

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

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

foo = 1;

foo();

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

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

正是由于这种将函数作为第一类对象的行为,javascript 无法阻止重新分配,否则您无法重新分配变量(另一方面,纯函数式语言在不允许变量重新分配方面没有问题)。


变通方法和最佳实践:

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

javascript 中有两个强大的特性可以缓解这个问题:对象闭包

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

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

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

jQuery = null;

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

于 2012-09-11T03:22:58.003 回答
4

只是从 slebetman 的回答开始,您可以在声明变量或函数之前使用以下内容检查是否存在。

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

再一次,您进行此检查的原因是因为您希望/需要将某些内容放在全局范围内,即使通常不需要它。不使用 avar会将其隐式放入全局范围。

于 2012-09-11T03:34:58.270 回答
-1

试试这个。它对我有用!!!

$(document).ready(function () {
    var all_functions = [];
    var duplicate_functions = [];
    var reportRecipientsDuplicate = [];
    for (var i in window) {

        if ((typeof window[i]).toString() == "function") {
            if (window[i].name) {
                all_functions.push(window[i].name);
            }
        }
    }

    var all_functions1 = all_functions.sort();


    for (var i = 0; i < all_functions1.length - 1; i++) {
        if (all_functions1[i + 1] == all_functions1[i]) {
            duplicate_functions.push(all_functions1[i]);
        }
    }
    console.log("Duplicate functions on page");
    console.log(duplicate_functions);
});
于 2018-03-01T11:27:23.983 回答