存储类实例成员函数的引用使其范围变宽

时间:2017-07-05 10:19:08

标签: node.js class scope ecmascript-6 this

我正在使用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

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

1 个答案:

答案 0 :(得分:1)

使用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

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

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