一个叫Jack的巨星出了一本书,为了带动销量,他决定给每一个要出售的书签名。可是,他当然没有这个时间来做这种事,于是他决定雇一个叫Tom的人来帮他做这件事,他对Tom说,在这些书上签上我的名字。于是Tom就照着做了:
var star = {
_name : "Jack",
hirePerson : function(person) {
person.signBook = function(book) {
book.sign("This book is from " + this._name);
}
}
};
var tom = {
_name : "Tom"
};
var book = {
sign : function(name) {
console.log(name);
}
};
star.hirePerson(tom);
tom.signBook(book);
结果却发现书上签的却是:
This book is from Tom
Jack愤怒了,你怎么搞的,怎么书上签的是你的名字!Tom很无辜的说,可是你不是说,”在这些书上签上我的名字“吗?
"Oh, shit,我的名字!"
"是我的名字啊!"
于是Jack只好换一种说法,在这些书上签上Jack的名字。
hirePerson1: function(person) {
var jack = this;
person.signBook = function(book) {
book.sign("This book is from " + jack._name);
}
}
这下终于对了:
This book is from Jack
但是后来狗仔队知道了Jack找人顶替签名的事,Jack被人非议,于是他只好自己签名:
hirePerson2: function(person) {
person.signBook = this.bind(function(book) {
book.sign("This book is from " + this._name);
}, this);
},
bind: function(fn, context) {
return function() {
return fn.apply(context, arguments);
};
}