如何在Javascript中绑定隐藏的原型

时间:2016-01-13 23:10:07

标签: javascript

我试图在一个隐藏它的环境中访问Float32Array,更确切地说是可汗学院的编程环境。

我看到一个人在做类似的事情而且做了类似的事情并且我调整了他的代码,但是我并不真正理解为什么我通过这样编写代码来访问Float32Array。

Code:

order_revision

Firefox警告:

  不推荐使用

调用不带new的内置类型数组构造函数,并且在ES6中将被禁止

Chrome错误

  

构造函数Float32Array需要' new'

这告诉我,我在这里做错了什么,但我不知道它是什么。我怎样才能以更强大的方式访问Float32Arrays?

1 个答案:

答案 0 :(得分:5)

  

这告诉我,我在这里做错了什么,但我不知道它是什么。

不,它只是告诉你,无论工具告诉你什么都不懂你的代码。

如果没有Float32Array,你 new,你只是在提及它。

代码

this.Function("return Float32Array;");

...调用它在你的例子中调用的方式(松散模式)正在创建一个身体为return Float32Array;的函数,如下所示:

function anon() {
    return Float32Array;
}

......但它是在全球范围内评估的,而不是在本地范围内评估。

你的包装:

var Float32Array = (function() {
})()();

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

那就是说,请注意这段代码很容易被愚弄。也许它在Khan 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);

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