比较JavaScript中的2个函数

时间:2014-04-10 16:51:25

标签: javascript function

在比较Javascript中的函数时,我认为它会比较定义函数的内存,以交叉检查给定的2个函数是否相等。
因此,试图通过从以下相同对象的2个不同实例访问它来比较成员函数:

function testFn(name) {
    var name = name;
    var self = this;
    self.compareFn = function() {
        console.info(name);
    }    
}

var fn1 = new testFn('fn1');
var fn2 = new testFn('fn2');
console.info(fn1.compareFn == fn2.compareFn);  //Returns false

使用一个成员函数(" compareFn")定义了一个对象testFn并创建了它的两个实例(fn1,fn2),但是在比较" fn1.compareFn == fn2.compareFn" ,它失败了。

请记住,该成员函数在多个实例之间共享,只有局部变量将单独分配 请说明为什么这种比较失败。

6 个答案:

答案 0 :(得分:1)

实际上是为每个实例创建了该方法。你想在对象的原型上声明它。见下文。

var testFn = function(name) {
    this.name = name;
}

testFn.prototype.compareFn = function() {
   console.info(this.name);
}

var fn1 = new testFn('fn1');
var fn2 = new testFn('fn2');
console.info(fn1.compareFn == fn2.compareFn);  //Returns true

答案 1 :(得分:1)

如果您希望在多个实例之间共享该功能,请执行以下操作:

function testFn(name) {
    var self = this;
}

testFn.prototype.compareFn = function() {
  console.log(name);
};    

var fn1 = new testFn('fn1');
var fn2 = new testFn('fn2');
console.log(fn1.compareFn == fn2.compareFn); 

DEMO

答案 2 :(得分:1)

此操作失败,因为每次执行new testFn时都会生成新的compareFn;你没有指向构造函数之外的引用或继承原型。

您无法使用共享功能从构造函数中访问var iable,因为它无法访问该闭包。如果要实现共享功能,则需要将这些值移动到可引用的空间,即

function testFn(name) {
    var vars = {}; // using object because javascript passes refs for objects
    this.vars = vars; // make `this.vars` point to `vars`
    vars.name = name; // set whatever on your object
}
testFn.prototype.compareFn = function () {
    console.info(this.vars.name); // can access `vars` through ref of `this.vars`
};

现在

var a = new testFn('foo'), b = new testFn('bar');
a.compareFn === b.compareFn; // true;
a.compareFn(); // logs "foo"

答案 3 :(得分:1)

我认为它出现为false的原因是,至少在这里,不是测试“源代码”结果的相等性。它正在测试它们所引用的内存位置。这样做的原因是它无法以任何其他方式测试相等性。

衡量平等的不同方法:

  • 通过运行函数

    来测试返回值

    fn1.compareFn() == fn2.compareFn() //true

  • 通过调用toString()来测试源代码(注意:这在浏览器中没有标准化!):

    fn1.compareFn.toString() == fn2.compareFn.toString() //true

但是,因为它们是不同的实例(您没有调用testFn == testFnfn1.compareFn == fn1.compareFn),所以它们会引用不同的内存位置,因此相等的测试结果为false

关于这方面的更多信息也可以在这个问题上找到:' how compare two static function are equal or not in javascript'。

另外,作为一个注释,你应该使用三等于(===)而不是一个双等于'因为后者不测试类型的相等性(即检查2个变量都是数字,以及值为5)。

答案 4 :(得分:0)

每次调用函数testFn时,它都会创建一个新变量并为其赋值...

所以是的,它们是相同的功能,但它们不是一回事。

您可以使用其他几种模式来获得您想要的结果。在这种情况下,您需要使用原型模式:

// Constructors should start with an upper case letter
function TestFn(name) {
  this.name = name;
}

TestFn.prototype.testFn = function() {
  console.info(this.name);
}    


var fn1 = new TestFn('fn1');
var fn2 = new TestFn('fn2');
console.info(fn1.compareFn == fn2.compareFn);  // Returns true

答案 5 :(得分:0)

function testFn(name) {
    this.name = name;
}

testFn.prototype.compareFn = function() {
    console.info(name);
}

var fn1 = new testFn('fn1');
var fn2 = new testFn('fn2');
console.info(fn1.compareFn == fn2.compareFn);  //Returns TRUE

每次调用构造函数时都要重新定义函数,因此方法不相等。通过将它们分配给原型,它是相同的方法。

如果您有兴趣将name(或其他变量或函数设为私有),请查看this SO answer