小编yea*_*ght的帖子

const变量没有为立即调用的函数提升

我正在玩新的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控制台来运行测试.

javascript scope const hoisting ecmascript-6

10
推荐指数
1
解决办法
1250
查看次数

PassportJS serializeUser和deserializeUser执行流程

我正在使用带有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执行方法,控制流程执行一次?

mongoose node.js express passport.js

9
推荐指数
2
解决办法
8461
查看次数