如何在JavaScript中比较两个静态函数是否相等

7
如何比较JavaScript中的两个静态函数是否相等?
如何比较JavaScript中的两个静态函数是否相等?

你为什么想要比较它们? - Toskan
4个回答

6
String(f1) === String(f2)

2
我想你的意思是 String(f1) === String(f2),除非你有一个我不知道的自定义 string() 方法 :) - Andy E
3
另一种简洁写法,适合节省字节的人:""+f1 === ""+f2 - Andy E
它能与(String(f1.bind(this)) === String(f1.bind(this)))一起工作吗?我认为不行。 - Martin Meeser

6
var f1 = f2 = function( a ){ return a; };

在这里,你可以使用f1 === f2,因为它们指向同一内存并且它们是相同类型的。

var f1 = function( a ){ return a; },
    f2 = function( a ){ return a; };

在这里,您可以使用Andy E使用的字节节省器(它将函数隐式转换为其正文的文本作为字符串),

''+f1 == ''+f2

这是发生在幕后的要点:

f1.toString( ) == f2.toString( )  

编辑:在一年后回顾这篇文章,我同意@kangax的观点 - 你可能永远不应该这样做。


7
注意,var f1 = f2 = function(){ ... } 的结果是 f2 成为一个全局属性,因为将函数赋值给未声明的变量 f2。未声明的赋值通常是有害的,所以最好避免使用这种模式。另外,不要依赖于 Function.prototype.toString —— 它没有标准化,并且在不同的浏览器中会有所不同。 - kangax
1
我刚在IE 6、7、8、FF 2、3.0、3.5(Windows / Linux)、Opera 10(Windows / Linux)、Safari 4和Chrome(Windows / Linux)中测试了上述代码。你到底是为哪些浏览器开发的?Konqueror,哈哈?这是代码,有人可以证明我错了吗?javascript:(function(){var f1=function(a){return a;},f2=function(a){return a;};alert(f1.toString());alert(f2.toString());alert(""+f1==""+f2);})(); - Dan Beam
1
这里有几个我偶然发现的链接 - http://perfectionkills.com/those-tricky-functions/ ,所以不是我会依赖的东西。当然,你的情况可能会有所不同 ;) - kangax
1
我尽量避免使用会导致函数反编译的设计。当在封闭环境(例如企业内部应用)中工作或进行调试/分析(开发过程中)时,可以对函数进行反编译。但是,任何面向公共网络的内容最好不要使用它,这样就能减少在某些不常见的环境中出现问题的可能性。 - kangax
当通过bind()方法应用不同作用域到两个相同函数进行比较时,这将无法正常工作。这是有问题的。 - vsync
显示剩余7条评论

0

好的,就这么简单 - 如果你要比较函数,我想你肯定有一个理由。那么你的理由是什么呢? 我的理由是为了避免重复运行某个特定的函数。 我是这样做的(只是代码片段,以便理解)

   var x = function(){
    console.error("i am a functionX");
  }
   var y = function(){
        console.error("i am a functionX");



  }

    var z = function(){
       console.error("i am a functionZ");



  }
       var x2= x;

   var obj = new Object();
    obj[x] = "";
    obj[x2] = "";
    obj[y] = "";
    obj[z] = "";
    obj.abc = "xaxa";
                for (prop in obj) {
                    if (obj.hasOwnProperty(prop)) {
                      console.error(obj[prop] + " hello " + prop);
                    }
            }

函数x和y是相同的,尽管它们有不同的空格。 x和y与z不同,因为z具有不同的console.error。 顺便打开您的Firebug控制台,在JSBin示例中查看它


0
每当我需要比较函数时,我会确保没有作用域歧义并使用相同的函数对象。
假设我有一对库函数,其中一个参数是回调函数。为了举例说明,create1minuteCallback函数将设置一个1分钟的计时器,并在每个滴答上调用回调函数。kill1minuteCallback将关闭回调函数,您必须传递与create1minuteCallback相同的回调函数。
function create1minuteCallback(callback){
//implementation
}

function kill1minuteCallback(callback){
//implementation
}

很明显,这不会起作用,因为我们在第二行传递的函数是不同的:
create1minuteCallback(function(){alert("1 minute callback is called");});
kill1minuteCallback(function(){alert("1 minute callback is called");});

我通常这样做:

function callbackFunc(){alert("1 minute callback is called");}

create1minuteCallback(callbackFunc);
kill1minuteCallback(callbackFunc);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接