1

我正在玩 javascript,所以这听起来可能是一个微不足道的问题。在这样的一段代码中:

function timeFunction(fn, nameOfFn){
var start = Date.now();
fn();
var end = Date.now();
var time = end - start;
console.log(nameOfFn + ' took ' + time + 'ms');
}

function Person(name){
this.name = name;
this.sayName = function(){
    console.log(this.name);
}
}

var bob = new Person('bob');
timeFunction(bob.sayName,'sayName');

输出是:

result
sayName took 7ms 

(每次运行代码时时间都会有所不同)

不确定“结果”来自哪里以及为什么没有显示“鲍勃”。

4

2 回答 2

4

在您的sayName()功能this中不是您所期望的。它实际上是window,因此您正在记录该window.name属性(在您的情况下恰好是“结果”-我猜您正在 jsfiddle 中测试您的代码?)。

那是因为this在 JavaScript 中是根据函数的调用方式设置的,它不会自动指定函数“所属”的任何对象。(事实上​​,函数根本不真正“属于”对象——你的bob对象并不“拥有” .sayName(),它只是对它有一个引用。)

MDNthis 详细解释。

让您的代码按照您期望的方式运行的一种方法是使用该.bind()方法

timeFunction(bob.sayName.bind(bob),'sayName');
于 2013-10-08T11:14:06.197 回答
2

Bob由于this内部sayName方法的范围不同,未显示:尝试

function Person(name){
   var _this = this;

   this.name = name; 
   this.sayName = function(){
      console.log(_this.name);
   }
}

或者,更好的是,bind()按照@nnnnnn 在先前答案中的建议使用。

(当我执行你的代码时我看不到“结果”字符串,也许它来自另一段代码)

于 2013-10-08T11:14:13.413 回答