2016-01-13 46 views
2

我試圖在隱藏它的環境中訪問Float32Array,更確切地說,可汗學院編程環境。如何在Javascript中綁定隱藏的原型

我看到一個人在做一件類似的事情,我修改了他的代碼,但我不明白爲什麼通過這樣寫代碼來訪問Float32Array。

Code:

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

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

火狐警告:

調用沒有新的一個內建類型數組構造函數被棄用,並將在ES6

被禁止

Chrome的錯誤

構造Float32Array需要 '新'

這告訴我,我在這裏做得不對,但我不知道它是什麼。我怎樣才能以更強大的方式訪問Float32Array?

回答

5

這告訴我我在這裏做錯了事,但我不知道它是什麼。

不,它只是告訴你,無論什麼工具告訴你,不理解你的代碼。

你不是打電話Float32Array沒有new,你只是指它。

代碼

this.Function("return Float32Array;"); 

...叫它在你的榜樣叫(這是鬆散模式)創建的屍體是return Float32Array;的功能,這樣的方式:

function anon() { 
    return Float32Array; 
} 

。 ..但它在全球範圍內評估,而不是本地範圍。

您的包裝:

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

...是返回給定的函數,然後立即調用它的功能。所以你的Float32Array變量最終變成Float32Array在全局範圍內(繞過陰影)。


這就是說,請注意,這段代碼很容易被愚弄。也許它適用於Kad 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); 

...因爲全局符號被覆蓋。

+0

該工具是Firefox的控制檯。感謝:D – SlySherZ

+0

@SlySherZ:有趣的是,我沒有從Firefox的控制檯得到這個警告。你的意思是Firebug? *編輯:*我沒有從Firebug獲得它,但是我們可能會使用不同的版本(Firefox和Firebug)。 –

+0

我使用的是Vanilla,更新了Firefox v43.0.4。沒有安裝相關的延伸。 – SlySherZ