2016-01-21 67 views
1

我正在瀏覽一個爲JavaScript創建多平臺包管理和模塊系統的代碼庫。這段代碼中發生了什麼,以及沒有「with」關鍵字的基本實現將會是什麼

我找到了一個代碼的路徑,該代碼是從與「exports」變量關聯的函數中提取的。 我附上了下面的代碼片段,並且在運行代碼片段時,您會發現從該函數中提取「print」對象。 我想知道兩件事: -

  1. 此代碼是如何工作的?
  2. 如果沒有with語句,這個代碼可以以更簡單的方式實現嗎?

var context = { 
 
    exports: {} 
 
}; 
 

 
var fn = (function(args) { 
 
    with(args) { 
 
    return function logger() { 
 
     exports = { 
 
     print: function(res) { 
 
      console.log(res); 
 
     } 
 
     } 
 

 
    } 
 
    } 
 
}); 
 
fn = fn(context); 
 
fn.call(); 
 
context.exports.print('hello World'); //Prints the hello world

+2

'eval' and'with'。一個腳本中JavaScript的兩個*最佳部分*。 – epascarello

+0

在你問「代碼是如何工作的」之前,你應該問「代碼應該做什麼」? – 2016-01-21 04:23:53

回答

2

首先,評估非字符串是沒有意義的。刪除eval調用並使用該功能。

技術上,with語句執行此:

with語句爲一個 計算對象到當前 執行上下文的lexical environment添加一個object environment record。然後它使用這種增強的 lexical environment執行聲明。最後,它恢復原來的lexical environment

基本上,這意味着,當分配對象到標識符exports,就成了args的性質。

不要這樣做。 with聲明性能較差,嚴格模式下不允許。只需正常分配屬性。

var fn = function(args) { 
    return function logger() { 
    args.exports = { 
     print: function(res) { 
     console.log(res); 
     } 
    } 
    } 
}; 
+0

嗨,謝謝你的答案,我已經刪除了eval,並且腳本可以正常工作,但是在這個任務中,我不能將導出作爲屬性添加到任何參數中,這就是爲什麼我使用with,能否幫助我使用另一種解決方案?非常感謝 –

+0

是什麼讓你認爲「我不能把出口作爲任何爭論的推動力」? – Oriol

+0

我正在使用此代碼來編譯以下文件結構https://github.com/souparno/jsio.js/blob/master/example/logger.js,回購是在https://github.com/souparno /jsio.js –

相關問題