JavaScript中的孤立执行上下文

时间:2014-01-09 09:08:07

标签: javascript scope

我正在尝试在JavaScript中的空隔离执行上下文中执行一段代码。在下面的示例中,我正在尝试隔离isolated执行范围。我想要做的是在没有全局变量的上下文中执行函数。

(function() {
  'use strict';

  var scope = Object.create(null);
  var isolated = function() {
    'use strict';
    console.log(document); // Trying to get undefined
                           // but traces `document`.
  };

  isolated.call(scope);
})();

我认为取消全局变量很简单但有太多了!

var isolated = function(window, document, location /* etc */) {
  // ...
};

isolated.call(scope, undefined, undefined, undefined /* etc */);

有更好的方法吗?

3 个答案:

答案 0 :(得分:4)

在javascript本身中没有良好的方法(但请参阅Gareth Hayes的另一个选项)。

有几种不好的方法。

(function() {
  var scope = Object.create(null);
  var obscurer = {};
  for (var key in this) {
     obscurer[key] = undefined;
  }

  with (obscurer) {
    var isolated = function() {
      'use strict';
      console.log(document);
    };
  }

  isolated.call(scope);
})();

请注意,您实际上会收到错误,因为未定义控制台而不是文档,尽管您可以通过不阻止obscurer对象中的“console”来解决此问题。你可能会发现你需要比你意识到的更多的全局变量。

您也只是阻止了窗口的可枚举属性。如果您发现了想要阻止的不可数属性,则必须将它们添加到obscurer。

当然,使用with意味着您不能再使用严格模式了,每个人都会低头看着你......

如果您在节点而不是浏览器中工作,可以使用更多有趣的选项。

答案 1 :(得分:2)

使用我的MentalJS解析器隔离环境。然后,您可以通过自定义代码来选择它有权访问的对象/变量。

http://businessinfo.co.uk/labs/MentalJS/MentalJS.html

http://code.google.com/p/mentaljs/

默认情况下,它允许访问文档,但您可以阻止此操作,在此处自定义环境http://code.google.com/p/mentaljs/source/browse/trunk/MentalJS/javascript/Mental.js#260,然后您可以选择是否可以访问Math等。

答案 2 :(得分:0)

可以在没有ECMA6的情况下使用包含您的受信任需求保护代码的IIFE来完成,您可以在其中注入不受信任的需求隔离代码(参见示例)。

(function(injectedFunction) {
    /* Trusted code, that needs protection from untrusted code access */
    var hostingFuncPrivatePrimitive = "Hello there";
    var hostingFuncPrivateObject = {
        this_is_mine: true
    };

    var sharedPrimitive = 'This is shared';
    var sharedObject = {};

    // Running the untrusted code:
    injectedFunction(sharedPrimitive, sharedObject);

    console.log("sharedObject is: " + JSON.stringify(sharedObject));
    console.log("hostingFuncPrivateObject is: " +
        JSON.stringify(hostingFuncPrivateObject));
})(

(function(primitiveArg, objArg) {
    /* Untrusted code that needs isolation */

    // 1. using primitive (legal)
    console.log('primitiveArg is: ' + primitiveArg);

    // 2. Writing value to given objArg (legal):
    objArg.mumu = 'mimi';

    // 3. Trying to access host function variables (illegal)
    try {
        console.log('hostingFuncPrivatePrimitive is:' +
            hostingFuncPrivatePrimitive);
        hostingFuncPrivateObject.this_is_mine = false;
    } catch (e) {
        console.log(e);
    }
})

);

如果您将上述内容放在Chrome的控制台中,您将获得:

    primitiveArg is: This is shared
    VM117:29 ReferenceError: hostingFuncPrivatePrimitive is not defined
            at <anonymous>:26:17
            at <anonymous>:11:5
            at <anonymous>:16:3
    VM117:12 sharedObject is: {"mumu":"mimi"}
    VM117:13 hostingFuncPrivateObject is: {"this_is_mine":true}

P.S。:我知道我迟到了,但也许这对任何人都有帮助。