我正在玩新的ECMASCRIPT-6 const关键词.我不明白关键字的一个特定行为.
可以说我有两个功能
第一个案例
(function(){
console.log(_t);
const _t=10;
})();
Run Code Online (Sandbox Code Playgroud)
和 第二个案例
function t(){
console.log(_y);
const _y=11;
}
t();
Run Code Online (Sandbox Code Playgroud)
对于第一种情况,输出是(不明白为什么)
ReferenceError:在初始化之前无法访问词法声明`_t'
对于第二种情况,输出是(罚款)
未定义
第二种情况输出是预期的,但我不知道为什么第一种情况结果会引发错误.可以从错误中推断出变量没有被提升.但为什么?我发现这里是const使用块范围.这个范围有什么关系吗?
我正在使用Firefox Developer Version控制台来运行测试.
我正在使用带有express的passportJS来通过本地策略验证用户身份.我看过几篇关于如何设置护照和执行流程的文章.虽然关于护照的大部分内容都可以通过搜索找出来,但是用户的序列化和反序列化使我感到困惑.
我知道它用于在会话中保存用户信息以进行持久登录.我的序列化和反序列化代码是
passport.serializeUser(function(user, done){
done(null, user.id);
});
passport.deserializeUser(function(id, done){
User.findById(id, function(err, user){
done(err, user);
});
});
Run Code Online (Sandbox Code Playgroud)
我的问题
1)谁调用并填充serializeUser和deserializeUser的参数?它如何访问用户对象?为了理解这一点,我添加了日志
passport.serializeUser(function(user, done){
console.log(arguments.callee.caller);
done(null, user.id);
});
Run Code Online (Sandbox Code Playgroud)
在输出中得到[Function:pass]任何人都可以解释一下吗?
2)我使用mongodb来存储用户信息.MongoDB将_id作为文档的默认ID.理想情况下,serializeUser和deserializeUser应该使用user._id而不是user.id. 但它在user.id中工作正常,这在User用户中是不可用的.这是在控制台中打印的用户对象
{ _id: 5505f231b810dbd4098ac76a,
__v: 0,
google: {},
twitter: {},
facebook: {},
local:
{ password: '$2a$08$9NGd0xNu0JbWMZ07ufyFRu8guwy147k8IBl5cAC4Y8APOuxreNI32',
email: 'xxxx@xxx.com' } }
Run Code Online (Sandbox Code Playgroud)
这怎么可能?
3)一旦done执行方法,控制流程执行一次?
const ×1
ecmascript-6 ×1
express ×1
hoisting ×1
javascript ×1
mongoose ×1
node.js ×1
passport.js ×1
scope ×1