CoffeeScript詞法作用域和變量安全

2018-08-25 14:40 更新

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


CoffeeScript 編譯器會(huì)考慮所有變量, 保證每個(gè)變量都在詞法域里適當(dāng)?shù)乇欢x — 你永遠(yuǎn)不需要自己去寫 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ù)里沒有被重新定義, 因?yàn)樗呀?jīng)存在于作用域當(dāng)中了. 同時(shí), 內(nèi)層函數(shù)里的 inner 不應(yīng)該改變外部的同名的變量, 所以在這里有自己的聲明.


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


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


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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)