2016-08-23 2 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

ええ、彼のコードは実際に動作します。もしあなたがブロックを取得するための 'var'を 'if'中に変更すると、... – user1775718

答えて

2

letキーワードは、ブロックがスコープされていますhttps://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Statements/let

let x = "hey"; 
{ let x= "hi"; } 

を、それはそれ自身のスコープ内にあるので、外let xが上書きされていません。あなたの質問に戻ってくる。 let Auth0Lockifブロックにのみ存在します。

+0

HAHA !!はい、私はちょうどそれを取り組んだ! :Dは2番目に受け入れます... – user1775718

1

コードがブラウザで実行されているかどうかを判断します(ブラウザではtypeof window === "object")。そうであれば、CommonJSスタイルのモジュールローダーを使用して'auth0-lock'モジュールをロードしようとします。

その2つの大きな問題があります。同様nodejs側で実行するように意図されている場合は

は、モジュールは、それが本当のために定義されていないためTypeError: Auth0Lockは、11行目で定義されていないスローされます、。

letキーワードがブロックスコープであるため、ブラウザーで実行されている場合でもTypeErrorが発生するため、11行目ではまだ定義されていません。