簡體   English   中英

設置評估范圍

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM