2014-01-29 181 views
4

有沒有一種方法來定義範圍,使其完全空?理想情況下,這會導致window未定義。或者window始終可用於每個範圍排列?我最初的想法是沿apply荷蘭國際集團的空對象,以將閉合線的東西,但window仍然被定義:創建一個空範圍?

(function() { 
    console.log(this); // an empty object 
    console.log(window); // the window object is still defined 
}).apply({}); 

有什麼辦法來規避window及其相關變量,還是我只是想逗權現在?

+0

什麼_final_目標? – undefined

+0

理想情況下,我想能夠控制我的範圍中存在的所有變量,例如,我可以記錄當前範圍內的所有內容,並將結果作爲我定義的變量。我的意思是,顯然,這只是一個例子,我可以通過在各自的'toString'值中記錄'[native code]'來記錄任何東西,但希望它能夠說明我的目標。 –

回答

2

如果您在瀏覽器外執行javascript,則不需要有窗口對象。例如,nodejs腳本沒有窗口對象,但它們確實有一個全局過程對象。

如果你真的想有沒有可用的窗口對象,你可以用新範圍內的局部變量破壞它...

(function(){ var window = undefined; console.log(this); console.log(window) }).apply({}); 

這不觸及全球window對象,不能摔倒,但應在當地覆蓋它。

一個更普遍的包裝,作爲內部範圍從外範圍繼承...

(function(){ var window = undefined; (function(){ 
    console.log(this); 
    console.log(window); 
}).apply({}); })(); 

編輯:添加通用解決方案的所有全局變量...

// create self invoking anonymous function 
;(function(){ 
    // enumerate all global objects (`this` refers to current scope - assumed to be global at this point) 
    var globals = Object.keys(this); 
    // loop through all globals 
    for(i in globals){ 
     // don't clobber the `console` global - we will need it! 
     if(globals[i] !== "console"){ 
      // initialise local variable in current scope with name of every global 
      eval("var " + globals[i]); 
     }; 
    }; 
    // create scope with empty object for `this` and all globals reset 
    ;(function(){ 
     console.log(this); 
     console.log(window); 
     /* for node.js, check process, not window ... */ 
     // console.log(process); 
    }).apply({}); 
})(); 
+0

我一直希望在瀏覽器中提供與JS相關的答案,理想情況下我想避免單獨暴露每個全局變量,因爲這不像我想的那樣靈活。如果這是不可能的,但是,我會接受這個答案。 –