我遇到了这个问题。需要检查2个功能是否相同或是否相同。 所以场景有点像这样: 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)
所以现在我们知道这些是两个不同的对象
答案 0 :(得分:0)
函数是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); }

答案 1 :(得分:0)
考虑以下示例:
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个函数引用是安全的。