在常规的面向对象语言中(比如C++),this指针的指向是确定的。但在JavaScript中,this指向依赖于运行环境。
下面的例子,预期的输出是nihao
:
class A {
setEventListener(func) {
this.callback = func;
}
triggerEvent() {
this.callback();
}
}
class B {
constructor(a) {
a.setEventListener(this.onEvent);
this.localValue = "nihao";
}
onEvent() {
console.log(this.localValue);
// console.log(this);
}
}
var a = new A();
var b = new B(a);
a.triggerEvent();
但实际输出是undefined
。
在onEvent中打印下this
,可以看到,它指向的是对象a
而不是b
:
A { callback: [Function: onEvent] }
这是因为在JavaScript中,this指向依赖于运行环境。上面的回调是被对象a执行的,所以onEvent
的执行上下文是对象a。这有点像dart的Mixins。
可以在注册回调的时候,调用bind
函数强制进行强制绑定,将下面的代码:
a.setEventListener(this.onEvent);
改成:
a.setEventListener(this.onEvent.bind(this));
这样就能得到预期的输出nihao
。
关于JavaScript中this指针,可以参阅下面几篇文档:
capabilities将系统root权限按功能单元划分,使用者按需打开/关闭相关权限,比基于UID的权限控制方式更精细。
不过,Linux下的capabilities是线程相关的,同一个进程的不同线程可以具有不同的capabilities权限,使用不当,可能会造成权限泄露。
可以使用libpsx规避该问题,它的原理很简单,就是把当前进程中所有线程的capabilities设置一遍。
本文主要介绍fork导致的死锁问题及其解决方法。
本文介绍在共享内存中自建hash的一种方法。
Cyber RT是apollo的运行环境框架,提供了模块动态加载机制。
本文基于apollo v6.0介绍Cyber RT的模块加载流程。
车载软件开发调试,不可能每次都出车路测,否则成本太高。
apollo中提供了cyber_recorder工具,可以将报文录制下来,保存为文件。这样,实际路测的时候,可以把相关报文保存下来,后续可以通过报文回放进行开发调试。
本文主要基于apollo v6.0介绍cyber_recorde的报文录制功能。