JavaScript中的吊装和“放行”

时间:2018-08-20 17:40:02

标签: javascript scope hoisting

问题是:

为什么这不会引发参考错误:

console.log(a)
let a = 5;

但这会引发参考错误:

{
 console.log(a)
 let a = 5;
}

现在,如果我们使用'var',则在两种情况下,代码都将运行并注销'undefined',但是有人可以解释'let'(和'const')的情况。

1 个答案:

答案 0 :(得分:2)

如评论中所述,这两个都引发参考错误。

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

    LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();

    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/pell");
    dataSource.setUsername("daniel");
    dataSource.setPassword("root");
    factoryBean.setDataSource(dataSource);

    factoryBean.setPackagesToScan(new String[] {"eu.pell.models"});

    JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    factoryBean.setJpaVendorAdapter(vendorAdapter);

    Properties properties = new Properties();
    properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
    properties.setProperty("hibernate.ddl-auto", "update");
    properties.setProperty("hibernate.show_sql", "true");
    factoryBean.setJpaProperties(properties);

    return factoryBean;
}

@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(emf);
    return transactionManager;
}

@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
    return new PersistenceExceptionTranslationPostProcessor();
}

console.log(a)
let a = 5;

但是你是对的。如果您使用{ console.log(a) let a = 5; },则var将记录到控制台。

undefined

blog post on medium(不是我本人)上,您可以在其中了解更多信息。

  

JavaScript引擎将使用“ var”的所有变量声明都视为   如果在函数范围的顶部声明了它们(如果声明了   在函数内部)或全局范围(如果在函数外部声明)   不管实际的声明在哪里发生。这本质上是   “吊装”。

这仅适用于console.log(a) var a = 5;varlet会引发参考错误,并且有据可查(请参阅ECMAScript 2015 specification)。这是因为尽管悬挂了constlet,但直到代码执行初始化行时它们才被初始化。 constlet被吊起和初始化之间的时间通常称为临时死区