问题是:
为什么这不会引发参考错误:
console.log(a)
let a = 5;
但这会引发参考错误:
{
console.log(a)
let a = 5;
}
现在,如果我们使用'var',则在两种情况下,代码都将运行并注销'undefined',但是有人可以解释'let'(和'const')的情况。
答案 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;
。 var
和let
会引发参考错误,并且有据可查(请参阅ECMAScript 2015 specification)。这是因为尽管悬挂了const
和let
,但直到代码执行初始化行时它们才被初始化。 const
或let
被吊起和初始化之间的时间通常称为临时死区。