var ctx = {"test":function(){document.write('ok');}}
var s = `
// test 不能重定义, 重定义 safari 就出错 ReferenceError: Can't find variable: main
function test() {
}
function main() {
test();
}
main();
`;
with(ctx) {
eval(s);
};
1
china521 OP ```var ctx = {"foo":function(){}}
var s = ` // 不能重定以任何 ctx 里定义过的函数 function foo() { } function bar() { } bar(); `; with(ctx) { try{ eval(s); }catch(err) { document.write(err); } }; ``` 更简单的代码, safari 出错,chrome 正常 |
2
lrz0lrz 2018-03-27 14:33:03 +08:00
为什么要用 with、eval 呢?
|
4
blackywkl 2018-03-27 16:26:31 +08:00
@china521 不是不能重复定义的问题啊?
``` var ctx = {"test":12313} var s = 'function test() {}' with(ctx) { eval(s); }; ``` ctx.text 变成 function 了 |
5
china521 OP @blackywkl 是的,with 进去的函数不能被里面的 eval 重定义,一重定义好像会改变当前 eval 的作用域到第一次定义的地方,就出现了这种错误,好像是 safari 的 BUG
|
6
blackywkl 2018-03-28 23:07:15 +08:00
看了下 with 在 MDN 的定义,感觉 safari 是对的???
If an unqualified name used in the body matches a property in the scope chain, then the name is bound to the property and the object containing the property. Otherwise a ReferenceError is thrown. |