var me = { name: 'Kyle' }; var you = { name: 'Reader' } function identify(){ return this.name.toUpperCase(); } function speak(){ var greeting = "Hello, I'm " + identify.call(this); console.log(greeting); } identify.call(me); // KYLE identify.call(you); // READER speak.call(me); // hello, 我是KYLE speak.call(you); // hello, 我是READER
这段代码可以在不同的上下文对象(me 和 you)中重复使用函数 identify() 和 speak(),不用针对每个对象编写不同版本的函数。如果不使用 this,那就需要给 identify() 和 speak() 显式传入一个上下文对象。
var me = { name: 'Kyle' }; var you = { name: 'Reader' } function identify(context){ return context.name.toUpperCase(); } function speak(context){ var greeting = "Hello, I'm" + identify(context); } identify(you); // READER speak(me); // hello, 我是KYLE
随着你的使用模式越来越复杂,显示传递上下文对象会让代码变得越来越混乱,使用 this 则不会这样。this 提供了一种更优雅的方式来隐式“传递”一个对象引用,因此可以将 API 设计得更加简洁并且易于复用。