我正在使用Node v8.1.3
我在文件Utility
中有一个类utility.js
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(...)
时,this
是utility
。但是,当您呼叫functionToCall(...)
时,this
是undefined
。或者,如您在注释中所建议的,您可以将
functionToCall
绑定到utility
:const utility = require('./utility');
let functionToCall = utility.getCurrentWeatherByLatLong;
functionToCall = functionToCall.bind(utility);
functionToCall(Number(latitude), Number(longitude)).then((result) => {
console.log(result);
})
关于node.js - 存储类实例成员函数的引用使其作用域松散,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44923432/