2016-08-23 78 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行中它仍然没有定义。