2016-05-20 37 views
-1

我正在編寫一個腳本,該腳本可以提取任何想要訪問窗口對象的JavaScript文件。因此,我想欺騙窗口對象,以獲得我需要的結果。允許所需的模塊訪問本地範圍

// arbitrary.js 
var foo = window.bar; 
-> Error: window undefined. 

因此,我想將一個窗口對象注入模塊的本地作用域。假裝我沒有爲arbitrary.js

// server.js 
global.window = {...}; 
require('./arbitrary"); 

這不起作用,因爲arbitrary.js專門嘗試訪問「窗口」,而不是「global.window」所以,如果我把它放在不要緊的編輯權限全局對象上的對象。看來我不能將對象注入到任意.js的作用域中。

有誰知道如何做到這一點?也許我應該使用與「require」不同的函數來讓random.js代碼在包含它的範圍內運行?我還沒有找到任何方法來做到這一點。我應該以某種方式使用eval()嗎?

+0

@ jfriend00真的嗎?我真的希望我能避免這種情況。 – Willem

+1

我必須錯過一些東西,但是你所描述的應該「只是工作」。只是爲了確認,你正在節點中運行它,而不是將它瀏覽/放到瀏覽器中,對吧? –

+0

@ go-oleg我在節點(6.1.0)上運行這個。基本上我可以做window = global.window,然後它可以工作。它似乎並不認爲全局是「底層」範圍,但它可以訪問全局對象本身。有點奇怪。 – Willem

回答

-1

您可以使用工廠模式。

global.window = {hi: "hello world"}; 
var arb = require('./arbitrary')(global.window); 
arb.myFunc(); 

在arbitrary.js:

module.exports = function(window){ 
    var foo = window.bar; 

    function myFunc() { console.log(window.hi);} 

    return { 
     myFunc: myFunc 
    } 
} 
+1

請記住「假裝我沒有針對任意.js的編輯權限」。我不能把出口放在那裏。 – Willem

+0

我錯過了那個。我認爲你可以訪問任意的,因爲加載訪問全局對象的js文件似乎很愚蠢。我能問這背後的動機嗎?你爲什麼會故意污染你的全球範圍? –

+0

我明白這似乎很愚蠢。它基本上是自動構建的js文件,我無法控制它們的製作方式。我不想每次編譯它們(通常都是這樣),所以我寧願能夠讓它們自動運行,但它們都是自制的。 – Willem

0

您所提供的代碼實際工作,至少在Node.js的6.2.0。

arbitrary.js

var foo = window.bar 

server.js

global.window = {foo: "foo"} 
require("./arbitrary.js") 

運行node server.js不給任何錯誤。

+0

等什麼?對我來說,global.window.bar工作,但不是window.bar。這是預期的行爲?我正在運行節點6.1.0。 你能不能把事情分配給任意.js裏面的窗口嗎? – Willem

+0

@Willem是的,也分配作品。 –

+0

這很奇怪。我想我有一些搜索和調試與我的節點及其全局對象/範圍。謝謝(你的)信息! – Willem