我试图在一个对我隐藏的环境(更确切地说是可汗学院编程环境)下访问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/