2017-04-07 50 views
1

我需要編程生成多個<script>標籤,除了參數不同之外,每個標籤幾乎都是相同的。因此,例如:多個<script>標籤,每個都有自己的作用域

<script> 
    function foo() { console.log('1'); } 
    /* lots of very complicated code which calls foo() */ 
</script> 

<script> 
    function foo() { console.log('2'); } 
    /* lots of very complicated code which calls foo() */ 
</script> 

在這個例子中所述第一腳本具有「1」的參數值,以便將其產生的代碼打印「1」到控制檯,而第二腳本具有「2」的參數值。

我知道這個問題到目前爲止會冒犯許多優秀的程序員的敏感性。這當然是非常簡單的,我需要這樣做的原因超出了這個問題的範圍。

據我所知,這些<script>標籤將共享全局範圍,所以它們的foo實現將會發生衝突。一種修復方法是單獨命名它們,例如foo1foo2。事實上,我有很多這樣的功能,我想知道是否有更好的方法。

是否有一種很好的方法可以將每個<script>標記放在其自己的範圍內,以便foo實現不會發生衝突?我寧願在沒有任何單獨的庫或預處理等的情況下執行此操作 - 只需使用原生JavaScript。

+0

'$(」 SomeClass的。 ').click(foo)' - 只需以這種方式附加處理程序。 – zerkms

+0

@zerkms會更簡單,但我不認爲這是OP的問題 –

+0

@AmitJoki什麼是OP的問題呢? – zerkms

回答

4

我認爲做你想做的事情的唯一方法是來包裝你的代碼在一個自執行的函數

<script> 
(function() { 
    function foo() { console.log('1'); } 
    /* lots of very complicated code which calls foo() */ 
})(); 
</script> 

<script> 
(function() { 
    function foo() { console.log('2'); } 
    /* lots of very complicated code which calls foo() */ 
})(); 
</script> 

如果你這樣做在這兩種情況下,那麼它應該有預期的效果。 如果這是一個選項,它也可以選擇將兩個片段放在同一個腳本標記中。

0

如果問題更復雜,並且出於某種原因想要分隔命名空間,則可以創建對象。

<script> 
var scope1 = (function(){ 
    return{ 
    foo: function() {console.log('1');} 
    } 
})(); 
</script> 

<script> 
var scope2 = (function(){ 
    return{ 
    foo: function() {console.log('2');} 
    } 
})(); 
</script> 

然後(使用全局範圍):

scope1.foo(); //prints 1 
scope2.foo(); //prints 2 

我不知道你的問題的各個方面,希望你找到最佳的解決方案:)

相關問題