我正试图在一个隐藏它的环境中访问Float32Array,更准确地说,就是可汗学院的编程环境.
我看到一个人做hacky做类似的事情,我调整了他的代码,但我真的不明白为什么我通过这样编写代码来访问Float32Array.
var Float32Array = (function () {
return this.Function("return Float32Array;");
})()();
var a = new Float32Array([1, 2, 3]);
Run Code Online (Sandbox Code Playgroud)
Firefox警告:
不建议使用不带new的内置类型数组构造函数,并且在ES6中将被禁止
Chrome错误
构造函数Float32Array需要'new'
这告诉我,我在这里做错了,但我不知道它是什么.我怎样才能以更强大的方式访问Float32Arrays?
这告诉我,我在这里做错了,但我不知道它是什么.
不,它只是告诉你,无论什么工具告诉你,你不理解你的代码.
你不打电话 Float32Array不new,你只是提到它.
代码
this.Function("return Float32Array;");
Run Code Online (Sandbox Code Playgroud)
...调用它在你的例子中调用的方式(松散模式)正在创建一个函数体return Float32Array;,如下所示:
function anon() {
return Float32Array;
}
Run Code Online (Sandbox Code Playgroud)
......但它是在全球范围内评估的,而不是在本地范围内评估的.
你的包装:
var Float32Array = (function() {
})()();
Run Code Online (Sandbox Code Playgroud)
...是一个返回给定函数然后立即调用它的函数.因此,您的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);
})();
Run Code Online (Sandbox Code Playgroud)
但会在这里失败:
(function() {
window.Float32Array = function() {
console.log("Mine");
};
var y = (function() {
return this.Function("return Float32Array;");
})()();
var foo = new y(10);
console.log("Done", foo);
})()
Run Code Online (Sandbox Code Playgroud)
或者在这里
function Float32Array() {
console.log("Mine");
}
var y = (function() {
return this.Function("return Float32Array;");
})()();
var foo = new y(10);
console.log("Done", foo);
Run Code Online (Sandbox Code Playgroud)
...因为全局符号被覆盖.
| 归档时间: |
|
| 查看次数: |
65 次 |
| 最近记录: |