我遇到了这个问题。需要检查两个函数是否相同或指相同。因此,场景有点像这样:FN1功能是匿名的。
function fnName(args) {
if(this.fn1 === this.json1.fn1)
//this is true
else
//this is false
}
这里this.fn1和this.json1.fn1指向相同的函数定义。有没有办法找出他们是否指向相同的指向?
我尝试使用 function.toString((,但这给任何函数的输出提供了相同的输出。
function() { [native code] }
进行比较,它赋予了任何2个函数的输出。
在比较 === 时,它并不认为它们一样。在调试时,它表明它指向同一行的函数。
在做 object.is(this.fn1,this.json1.fn1(; 是返回false,这意味着它们不是同一对象。
如何通过使用绑定功能,例如:
将这些函数设置为属性。fn1 = fn1.bind(this);
json1["fn1"] = fn1.bind(this)
所以现在我们知道这些是两个不同的对象
函数是JavaScript中的对象。即使是两个完全相同的函数,仍然是内存中的两个不同对象,并且永远不会相等。
您所能做的就是将功能转换为字符串并比较字符串。我猜想,尽管您实际上并未在比较表达式中调用.toString()
函数,而是比较了实际的.toString
功能代码。
var o1 = {
foo: function (message){
console.log(message);
}
};
var o2 = {
log: function (message){
console.log(message);
}
};
var o3 = {
log: function (msg){
console.log(msg);
}
};
var test = o1.foo;
function compare(f1, f2){
// You must convert the functions to strings and compare those:
console.log(f1.toString() === f2.toString());
}
compare(o1.foo, o2.log); // true - the two functions are identical
compare(o1.foo, o3.log); // false - the two functions are not identical
compare(o1.foo, test); // true - the two variables reference the same one function
// This is just to show how not properly calling toString() affects the results:
console.log(o1.foo.toString); // function toString() { [native code] }
console.log(o1.foo.toString()); // function (message){ console.log(message); }
考虑以下示例:
var fun1 = function() { console.log('fun1') };
var fun2 = fun1;
var fun3 = fun1.bind({});
console.log(fun1 === fun2); // true
console.log(fun1 === fun3); // false
function test() {
fun1 = () => { console.log('new function') }
fun1();
fun2();
fun3();
console.log(fun1 === fun2); // false
}
fun1();
fun2();
fun3();
test();
-
fun3
是fun1
的副本,它比较返回false
。 -
fun2
和fun1
是对同一功能的引用。 - 内部,
test()
功能,将fun1
分配给新功能。但是,fun2
仍指向旧功能,因此在比较时返回false。
因此,可以安全地比较2个使用===
的功能参考。