CoffeeScript詞法作用域和變量安全

2018-08-25 14:40 更新

變量是使用的時候隱式聲明的(沒有var關(guān)鍵字)
編譯器確保變量在詞法作用域中聲明;已經(jīng)在作用域中聲明的外部變量不會在函數(shù)內(nèi)部再次聲明
使用內(nèi)部變量不會遮蔽外部變量,而只會引用外部變量;因此,不要在深度嵌套的函數(shù)中重用外部變量名
CoffeeScript的輸入被包裝在一個匿名函數(shù)中,因此污染全局命名空間的可能性極小
如果要給其他腳本創(chuàng)建頂級變量,要把這些變量作為window對象的屬性來聲明,或者在CommonJS中作為exports對象的屬性來聲明:exports ? this


CoffeeScript 編譯器會考慮所有變量, 保證每個變量都在詞法域里適當(dāng)?shù)乇欢x — 你永遠不需要自己去寫 var.

outer = 1
changeNumbers = ->
  inner = -1
  outer = 10
inner = changeNumbers()
var changeNumbers, inner, outer;

outer = 1;

changeNumbers = function() {
  var inner;
  inner = -1;
  return outer = 10;
};

inner = changeNumbers();

注意所有變量的定義都被推到相關(guān)的頂層作用域, 也就是第一次出現(xiàn)的位置. outer 在內(nèi)層的函數(shù)里沒有被重新定義, 因為它已經(jīng)存在于作用域當(dāng)中了. 同時, 內(nèi)層函數(shù)里的 inner 不應(yīng)該改變外部的同名的變量, 所以在這里有自己的聲明.


其行為和 Ruby 的局部變量的作用域?qū)嶋H上是一致的. 由于你沒有對 var 關(guān)鍵字的直接訪問, 根據(jù)需要隱藏一個外部變量就很容易, 你只能引用它. 所以在寫深層的嵌套的函數(shù)時, 注意不要意外用到和外部變量相同的名字.


盡管要說清楚會受到文檔長度限制, 函數(shù)的所有 CoffeeScript 結(jié)果都被一個匿名函數(shù)包裹:(function(){ ... })(); 這層安全的封裝, 加上自動生成的 var 關(guān)鍵字, 使得不小心污染全局命名空間很難發(fā)生.


如果你希望創(chuàng)建一個其他腳本也能使用的頂層變量, 那么將其作為賦值在 window 上, 或者在 CommonJS 里的 exports 上. 存在操作符(existential operator)可以幫你寫出一個可靠的方式找到添加位置; 比如你的目標是同時滿足 CommonJS 和瀏覽器: exports ? this

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號