2016-07-15 5 views
2

мне интересно, почему этот кусок кода работает:Const переменная доступна во всем файле

class App extends React.Component { 
    render() { 
     return (
     <div> 
     <Widget /> 

     </div> 
    ); 
    } 
    } 

const Widget =() => {return <h1>hello</h1>}; 

Я думал константной переменной должен быть невидимым для App класса (TDZ).

+0

Почему вы так думаете? –

+0

Обычно (например, в браузере), если я пытаюсь получить доступ к константной переменной, в том же блоке она была объявлена, но до того, как она была объявлена, я получаю «ReferenceError». Почему babel позволяет это? –

ответ

2

const переменной в блоке подъезд объема, App и Widget находятся в той же области в вашем примере

ОБНОВЛЕНИЕ:
Эта ситуация не связана с Бабель или реагировать или WebPack. Вы просто смешиваете две концепции javascript calling и defining. Ваш пример может выглядеть так, и это будет та же ситуация.

// function definition 
function app() { 
    console.log(a); 
} 

// variable definition 
const a = 2; 

// function call 
app(); 

Этот код содержит 2 для консоли. Javascript пытается получить доступ к переменной a только тогда, когда app вызовы функций.

Следующий пример

// function definition 
function app() { 
    console.log(a); 
} 

// function call 
app(); 

// variable definition and variable assignment 
const a = 2; 

, зарегистрирует undefined утешать, поскольку функции была вызвана прежде сопзЬ a присвоенного

+0

В браузере это: '(function() {console.log (a); const a = 2;})()' возвращает 'ReferenceError'. Константы являются блочными, но все соображения о «временной мертвой зоне», которые применяются для let, также применяются к const. –

+0

Это еще одна ситуация: 'console.log (a)' вызовов до '2' присваивается' a' –

+0

Как это отличается от кода, который я предоставил? Я также использую 'Widget' до того, как он был объявлен ... –

1

Widget находится в области на протяжении всего файла (константы блок-Scoped но вы объявили Widget в внешний охват).

Вы не получаете доступ к Widget до тех пор, пока не будет выдан render(), и к этому времени ему будет присвоено значение.

+0

Спасибо, теперь понятно. Тем не менее, я не понимаю, почему, когда у меня есть как '(function() {console.log (a); const a = 2;})()' почему babel переводит его в 'var' без каких-либо предупреждений? –

+0

@Adrian, если честно, я не уверен, почему Бабель не дает вам предупреждения, но эта ситуация отличается от ситуации в вашем вопросе, потому что вы обращаетесь к переменной до ее объявления. –

+0

Конечно, теперь я понимаю, что это другая проблема. Спасибо за вашу помощь. –

1

Другие ответы правильные, но неправильные. Код, который действительно работает, не содержит const или class. Ниже приведен код, который выполняется.

Если у вас есть сомнения, вставьте свой код в babel repl, и вы увидите, что будет выполнено браузером.

"use strict"; 

var _createClass = function() { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); 

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } 

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } 

var App = function (_React$Component) { 
    _inherits(App, _React$Component); 

    function App() { 
    _classCallCheck(this, App); 

    return _possibleConstructorReturn(this, Object.getPrototypeOf(App).apply(this, arguments)); 
    } 

    _createClass(App, [{ 
    key: "render", 
    value: function render() { 
     return React.createElement(
     "div", 
     null, 
     React.createElement(Widget, null) 
    ); 
    } 
    }]); 

    return App; 
}(React.Component); 

var Widget = function Widget() { 
    return React.createElement(
    "h1", 
    null, 
    "hello" 
); 
}; 
Смежные вопросы