存储一个类实例成员函数的引用使得它的范围变得松散

我正在使用节点v8.1.3

我在文件utility.js有一个类Utility

 class Utility { constructor() { this.typeChecker = require('javascript-type-checker'); this.internalErrors = require('../constants/internalErrors'); this.axios = require('axios'); this.config = require('../config'); } getCurrentWeatherByLatLong(latitude, longitude) { if(!this.isValidLatitude(latitude)) throw this.internalErrors.ERR_LAT_INVALID; if(!this.isValidLongitude(longitude)) throw this.internalErrors.ERR_LONG_INVALID; const url = `${this.config.BASE_URL}?appid=${this.config.API_KEY}&lat=${latitude}&lon=${longitude}`; return this.axios.default.get(url); } isValidLatitude(latitude) { return (this.typeChecker.isNumber(latitude) && latitude >= -90 && latitude <=90); } isValidLongitude(longitude) { return (this.typeChecker.isNumber(longitude) && longitude >= -180 && longitude <= 180); } } module.exports = new Utility(); 

现在,在我的另一个文件中,当我这样做

 const utility = require('./utility'); utility.getCurrentWeatherByLatLong(Number(latitude), Number(longitude)) .then((result) => { console.log(result) }) 

它工作正常。 但是,当我这样做

 const utility = require('./utility'); const functionToCall = utility.getCurrentWeatherByLatLong; functionToCall(Number(latitude), Number(longitude)) .then((result) => { console.log(result) }) 

我得到的错误: Cannot read property 'isValidLatitude' of undefined

为什么会发生此错误,我该如何解决? 谢谢!

使用bind函数来绑定上下文:

 constructor() { this.typeChecker = require('javascript-type-checker'); this.internalErrors = require('../constants/internalErrors'); this.axios = require('axios'); this.config = require('../config'); this.getCurrentWeatherByLatLong = this.getCurrentWeatherByLatLong.bind(this) } 

this指向函数被调用的对象。 所以,当你调用utility.getCurrentWeatherByLatLong(...)thisutility 。 但是,当您调用functionToCall(...)thisundefined

或者,如您在评论中所build议的那样,您可以将functionToCall绑定到utility

 const utility = require('./utility'); let functionToCall = utility.getCurrentWeatherByLatLong; functionToCall = functionToCall.bind(utility); functionToCall(Number(latitude), Number(longitude)).then((result) => { console.log(result); })