我试图在一个对我隐藏的环境(更确切地说是可汗学院编程环境)下访问Float32Array。

我看到一个人在做一些骇人听闻的事情来做类似的事情,然后我修改了他的代码,但是我不太明白为什么我通过这样编写代码才能访问Float32Array。

Code:

var Float32Array = (function () {
    return this.Function("return Float32Array;");
})()();

var a = new Float32Array([1, 2, 3]);

Firefox警告:



Chrome错误



这告诉我我在这里做错了,但我不知道这是什么。我如何以更可靠的方式访问Float32Arrays?

最佳答案



不,它只是告诉您,任何告诉您的工具都不理解您的代码。

您不是在没有Float32Array的情况下调用new,而是在引用它。

编码

this.Function("return Float32Array;");

...在您的示例(宽松模式)中的调用方式是创建一个主体为return Float32Array;的函数,如下所示:
function anon() {
    return Float32Array;
}

...但是它是在全局范围而不是局部范围内评估的。

您的包装器:
var Float32Array = (function() {
})()();

...是一个返回给定函数然后立即调用它的函数。因此,您的Float32Array变量最终将成为全局范围内的Float32Array(绕过阴影)。

也就是说,请注意,此代码很容易上当。也许它在可汗acadamy上下文中有效,但是只要将其分配给全局对象的Float32Array属性,或者在全局范围内重新声明它,就可以很容易地愚弄它。

也就是说,它在这里工作:
(function() {
  // Khan academy code
  function Float32Array() {
    console.log("Mine");
  }

  // Your code
  var y = (function() {
    return this.Function("return Float32Array;");
  })()();
  var foo = new y(10);
  console.log("Done", foo);
})();

但会在这里失败:
(function() {
  window.Float32Array = function() {
    console.log("Mine");
  };
  var y = (function() {
    return this.Function("return Float32Array;");
  })()();
  var foo = new y(10);
  console.log("Done", foo);
})()

还是这里
function Float32Array() {
  console.log("Mine");
}
var y = (function() {
  return this.Function("return Float32Array;");
})()();
var foo = new y(10);
console.log("Done", foo);

...因为全局符号被覆盖。

关于javascript - 如何在Javascript中绑定(bind)隐藏的原型(prototype),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34778806/

10-10 05:09