2016-08-23 84 views
-1

由於範圍/提升/加載順序,我遇到問題。在下面,Auth0Lock在第6行的if塊中定義,但不在其外面,或者在類中。有誰知道爲什麼?ES6類和模塊系統的範圍

import { EventEmitter } from 'events'; 
import { isTokenExpired } from './jwtHelper'; 

console.log('in'); 
const isClient = typeof window !== 'undefined'; 
if (isClient) { 
    let Auth0Lock = require('auth0-lock').default; 
    console.log('isClient'); 
    console.log('Auth0Lock inner', Auth0Lock); 
} 
    console.log('Auth0Lock outer', Auth0Lock); 
export default class AuthService extends EventEmitter { 
    constructor(clientId, domain) { 
    super(); 
    console.log('happening'); 
    if (!isClient) { 
     console.log('returning'); 
     return false; 
    } 
    // Configure Auth0 
    this.lock = new Auth0Lock(clientId, domain, {}); 
    // Add callback for lock `authenticated` event 
    this.lock.on('authenticated', this._doAuthentication.bind(this)); 
    // Add callback for lock `authorization_error` event 
    this.lock.on('authorization_error', this._authorizationError.bind(this)); 
    // binds login functions to keep this context 
    this.login = this.login.bind(this); 
    } 

// curtailed 
} 
+0

因爲編寫它的人沒有寫出可用的JavaScript代碼。試着問問他。 –

+0

@TamasHegedus啊!你也看到了鎖上的錯誤!對,對不起,我以爲你在說我! :D – user1775718

+0

是的,他的代碼實際上工作。如果你改變了它的變量,讓它把範圍限制在「if」括號中... – user1775718

回答

1

代碼嘗試確定它是否在瀏覽器(瀏覽器中的typeof window === "object")中運行,如果這樣做,它會嘗試使用某些CommonJS樣式模塊加載器加載'auth0-lock'模塊。

有兩個大的問題,這:

如果打算在一邊的NodeJS以及運行,該模塊將拋出一個TypeError: Auth0Lock不就行了11所定義,因爲它不是真正的定義。

如果它在瀏覽器中運行,它仍然會拋出一個TypeError,因爲let關鍵字是塊範圍的,所以在第11行中它仍然沒有定義。