[英]Set the scope of an eval
有沒有辦法設置評估的整體? 我想設置一個eval的全局變量,因此不必在obj
加上所有前綴。
如果執行以下操作,則會出現錯誤
ReferenceError:未定義MyClass
let obj = {
MyClass: class MyClass {
static CallMe() {}
}
}
eval(`
'use strict';
global = obj;
result = MyClass.CallMe();
`)
但是,如果我這樣做:
result = obj.MyClass.CallMe();
它可以工作,但是我想這樣做,所以我不必在調用前加上obj前綴。 有什么理由可以做到這一點?
我無法想象為什么需要在此處使用eval
,但是如果這樣做,則可以在評估的代碼中使用with (obj)
:
eval(`
'use strict';
with (obj) {
result = MyClass.CallMe();
}
`);
我仍然覺得您不應該在這里使用eval(它有什么用?),因為如果您不小心,很容易意外地使自己面臨注入漏洞。 您在這里使用eval是什么? 也許我們可以指出一種更好的方法。
不知道為什么要使用eval,尤其是以這種奇怪的方式使用eval,但這可能是您正在尋找的東西:
class MyClass {
static CallMe() {
return 'sample';
}
}
eval(`
'use strict';
let result = MyClass.CallMe();
console.log(result);
`)
其他人已經警告過您使用eval
的風險,因此我自己不會這樣做。
我當然在受控環境中找到了一些合法的eval
用例。 我假設您知道自己在做什么。
這可能會或可能不會有用:
let obj1 = { foo: () => console.log('scope: obj1') }; let obj2 = { foo: () => console.log('scope: obj2') }; const scopedEval = (context, code) => new Function('global', code)(context, code); scopedEval(obj1, ` global.foo(); `) scopedEval(obj2, ` global.foo(); `)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.