是否可以在函数中重新定义函数中的参数?

时间:2019-04-01 09:11:59

标签: javascript

我只能更改function a中的代码。例如,如果我有:

Object.define(window, 'App', {get: console.log.bind(null, 'World') });

微信将获取我的代码并将其转换为:

const App = console.log.bind(null, 'Hello')

Object.defineProperty(window, 'App', {
  set: ()=> {
    console.error("You are not allow to modify App");
  }
})

const sandbox = (App, Function, window) => {
  'use strict';
  function a() {
    'use strict';
    // *** I can only modify codes within this block ***
    Object.define(window, 'App', {get: console.log.bind(null, 'World') });
    // *** I can only modify codes within this block ***
  }
  function b() {
    'use strict';
    App();
  }
  a();
  b();
};

sandbox(App, ()=>(()=>({})), undefined);

现在,我想在function a中修改App,以便可以在function b中更改其行为,因此它将打印World而不是Hello

1 个答案:

答案 0 :(得分:1)

您对此答案发表了评论:

  

让我澄清一下。我只能在function(func)内更改代码。其余代码由微信生成。

您无法在该函数中将声明在其中的函数的AppPage参数转换为吸气剂。


您似乎正在尝试用getter替换参数,也许这样您就可以观察代码何时读取它。不,您不能这样做,因为参数不是对象的属性。¹

您当然可以用getter定义一个对象,然后在函数体内使用该对象,而不是直接使用参数:

function(App, Page) {
    const params = {
        get App() {
            // ...observe the read...
            return App;
        },
        get Page() {
            // ...observe the read...
            return Page;
        }
    };

    // Use `params.App` and `params.Page` in the body of the function.
}

...但是相当复杂。

嗯。我刚刚意识到,在松散模式下,如果用with (params) { /*...*/ }包裹函数主体,AppPage会解析为对象属性并触发getter [必须是宽松模式,因为严格模式不允许with。]请不要这样做,除非只是作为一种调试策略。:-))


¹(至少不是您的代码可访问的一个。从概念上讲,它们是词法环境对象中的绑定,但是1.绑定不是属性(尽管它们是相似的),2.是概念上的,实际的JavaScript引擎可能对此进行了优化,并且3. JavaScript代码无法访问词法环境对象(尤其是可以对其进行优化)。:-))