【JS / TS】函数 this 丢失问题

今天在写一个显示当前时间的网页,用了一个回调,来每秒更新时间。
但是实际运行时,时间并没有动态更新。

原因

仔细查了一下,原来是 Javascript 函数的 this 是在调用函数时确定的。

foo.call(this,args...);

观察一下函数的call函数的签名,可以发现第一个参数传入了 this 的值,函数运行时的 this 就是调用时传入的 this。
而回调函数被执行时,this已经不是我们原来预想的this了,所以变量没有被更改。

解决

那么如果要用回调函数,使用原来的this,该怎么办呢?
函数里提供了bind函数,可以用来内定函数调用时this的值和参数。

foo.bind(this,args...);

而在bind时写的参数,在执行时就会被插入到参数列表的最前面,可以用来内定前几个参数的值。
调用了bind之后,返回的是一个新的函数,它的this和前几个参数已经被内定死了。
之后函数被调用时无论传入的this是什么,实际执行时的this始终都是bind时内定好的this

【Android】Intent 启动 Activity

Intent 可以用于启动 Activity 或者在 Activity 间传递数据。

显式启动 Activity

// new Intent(Context context, Class class)
Intent intent = new Intent(this, TargetActivity.class);
startActivity(intent);

意图明确的 Intent,明确指出在 thiscontext 上启动 TargetActivity

隐式启动 Activity

首先在 AndroidManifest.xml 中 Activity 的 <intent-filter> 中定义 <action><category>

<activity android:name=".TargetActivity">
    <intent-filter>
        <!-- 可以有多个action和category -->
        <action android:name="com.example.test.ACTION_START"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="com.example.test.MY_CATEGORY"/>
    </intent-filter>
</activity>

【C++】移动语义

最近好好研究了一下 C++ 中的移动语义。

左值 & 右值

已经在内存中分配了地址的、可以取到地址的,是左值。
在内存中未分配地址的、仅存在于寄存器中无法取到地址的,是右值。

int a = 8; // a 已分配内存,是左值。
a + 1; // a + 1 仅存在于寄存器中,是右值。

右值引用

T&& 是右值引用,只接受右值

int&& a = 8; // 正确,8 仅存在于寄存器中。

int v = 9;
int&& b = v; // 错误,v 是左值,无法存入右值引用。
int&& c = v + 3; // 正确,v + 3 的结果仅存在于寄存器中,是右值,可以存入右值引用。