jsjs icon indicating copy to clipboard operation
jsjs copied to clipboard

ForIn的上下文有问题

Open axetroy opened this issue 7 years ago • 1 comments

https://github.com/bramblex/jsjs/blob/b0f67112f38ceb7eba8ecbf9357b8d6706e0dab1/src/eval.ts#L183

这里不应该是设置父级的作用域。

应该是设置for循环里的新作用域new_scope

亲测, 下面这个例子跑不痛。

import test from "ava";
import * as fs from "fs";

import vm from "../src/vm";

test("ForInStatement-1", t => {
  const sandbox: any = vm.createContext({});

  const obj: any = vm.runInContext(
    `
const obj = {
  1: false,
  2: false
};

for (let attr in obj) {
  obj[attr] = true;
}

module.exports = obj;
  `,
    sandbox
  );

  t.true(obj[1]);
  t.true(obj[2]);
});

attr应该是 0、1,但实际上,永远是1,因为for循环里面的作用域没有attr变量。

只有父级作用域有attr,而且attr=1

axetroy avatar Mar 04 '18 18:03 axetroy

嗯,这是个 bug ……

bramblex avatar Mar 05 '18 07:03 bramblex