ES6类和模块系统的范围
问题描述:
由于范围/提升/加载顺序,我遇到问题。在下面,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
}
答
的let
关键字块作用域:https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Statements/let
let x = "hey";
{ let x= "hi"; }
外let x
没有被覆盖,因为它是在它自己的范围。回到你的问题。您的let Auth0Lock
仅存在于if
区块中。
+0
HAHA !!是的,我刚刚解决了这个问题! :D将在第二秒接受... – user1775718
答
代码尝试确定它是否在浏览器(浏览器中的typeof window === "object"
)中运行,如果这样做,它会尝试使用某些CommonJS样式模块加载器加载'auth0-lock'
模块。
有两个大的问题,这:
如果打算在一边的NodeJS以及运行,该模块将抛出一个TypeError: Auth0Lock
不就行了11所定义,因为它不是真正的定义。
如果它在浏览器中运行,它仍然会抛出一个TypeError,因为let
关键字是块范围的,所以在第11行中它仍然没有定义。
因为编写它的人没有写出可用的JavaScript代码。试着问问他。 –
@TamasHegedus啊!你也看到了锁上的错误!对,对不起,我以为你在说我! :D – user1775718
是的,他的代码实际上工作。如果你改变了它的变量,让它把范围限制在“if”括号中... – user1775718