一个叫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); }; }