AssemblyScript中'this'关键字的正确用法及内存访问疑问
AssemblyScript类实例引用的正确性与内存安全疑问
我正在开发一个AssemblyScript应用,代码结构要求在一个类的构造函数中传入另一个类的实例,示例代码如下:
class Something { constructor(private context: MyContext) { } testMethod(): void { //Some logic which uses variables and methods from context class let a = this.context.getSomething(); // 注:原代码类型标注语法有误,此处修正 } } class MyContext { //Is below a correct usage of 'this'? somethingObj: Something = new Something(this); myMethod(): void { //Some logic which uses somethingObj this.somethingObj.testMethod() } getSomething(): any { // 补充示例方法使代码完整 return 1; } }
目前代码可正常构建运行,但我有疑问:MyContext类中的somethingObj字段使用this关键字是否正确?这是否会引发内存越界访问的运行时错误?
解答
this的用法完全合法
在AssemblyScript(以及TypeScript/JavaScript)中,类的字段初始化器会在构造函数执行阶段运行,此时this已经指向正在创建的MyContext实例,因此用new Something(this)初始化somethingObj是语法和语义上都正确的写法。不会引发内存越界访问
当执行new Something(this)时,MyContext的实例已经在内存中完成了空间分配,Something的构造函数只是持有了这个实例的引用。只要不在Something的构造函数中直接访问MyContext里尚未初始化的字段,就不会出现内存访问问题。你的示例代码中Something仅保存了context引用,没有在构造阶段调用依赖未初始化字段的逻辑,所以当前代码是安全的。潜在注意点
如果在Something的构造函数中直接调用this.context.myMethod(),会触发循环初始化问题——此时MyContext的somethingObj还未完成赋值,myMethod中访问this.somethingObj会得到undefined。但你的代码中没有这类逻辑,所以无需担心。
内容的提问来源于stack exchange,提问作者johnhill
相关产品推荐
相关产品推荐

