【发布时间】:2009-12-20 20:39:54
【问题描述】:
如何比较javascript中的两个静态函数是否相等?
【问题讨论】:
-
为什么要比较它们?
标签: javascript
如何比较javascript中的两个静态函数是否相等?
【问题讨论】:
标签: javascript
String(f1) === String(f2)
【讨论】:
String(f1) === String(f2) 除非你有一个我不知道的自定义 string() 方法:)
""+f1 === ""+f2
(String(f1.bind(this)) === String(f1.bind(this)))?我不这么认为?
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 - 你可能永远不应该这样做。
【讨论】:
var f1 = f2 = function(){ ... } 导致 f2 成为全局属性,因为未声明的函数分配给 f2。未声明的分配通常是有害的,所以最好避免这种模式。另外,不要依赖Function.prototype.toString——它不是标准化的,并且因浏览器而异。
javascript:(function(){var f1=function(a){return a;},f2=function(a){return a;};alert(f1.toString());alert(f2.toString());alert(""+f1==""+f2);})();
每当我需要比较函数时,我都会确保没有范围模糊并使用相同的函数对象。
假设我有一对将回调作为参数之一的库函数。为了这个例子,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);
【讨论】:
好吧,就这么简单——如果你要比较函数,你这样做是有原因的。你的理由是什么? 我的原因是不要两次运行某个功能。 我是这样做的(只是 sn-p 代码来了解这个想法)
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。 Btw open your firebug console to see it in the jsbin example
【讨论】: