JavaScript 如何擷取閉包變數?

來源:互聯網
上載者:User
var o = (function() {var person = {   //  let person  竟然也會被外部拿到 let 被打臉了啊name: 'Vincent',age: 24,__proto__ : null // 是的你沒有 看錯 真的是 指向 null};return {run: function(k) {return person[k];}}}());// 那麼問題來了, 挖掘機技術 呸呸呸 說錯了 口誤! 

回複內容:

來抖個機靈。抖前先把正經的說了:

JavaScript的閉包是一種頗為緊密的封裝。可以說,閉包是JavaScript在ES6的private Symbol之前唯一靠譜的“private”存取控制的實現方式。

在JavaScript層面沒有任何辦法可以通過閉包的函數對象取出閉包捕獲的變數——除非該函數自己把它返回出來(或者用其它方式傳遞出來)。這樣閉包就可以精確的控制自己想要暴露出來的資訊量。

所以例如說:
var o = (function () {  var a = 1  var b = 42  return {    foo: function () {      console.log(a + b)      return b    }  }})()
我也來抖個機靈:IE9 下 __proto__ 是無效的呢。所以在 Object.prototype 上添加 getter 的方法在 IE9 下依然有效。如果你引擎實現得好的話,那麼——是做不到的。你可以試著用霍爾邏輯證明一下……
不過如果引擎不支援 __proto__(似乎 IE 很長時間都沒支援),可以通過注入 Object.prototype 一個 getter 實現。原來是面試題,js都被這麼玩壞了。
明明是通過閉包實現的私人,那就讓他私人好了,為毛要訪問他呢,看著不爽就重構一下。我們可以通過return一個函數來擷取,具體看JS的閉包機制 。你是想問js是否有類似反射這種反設計的東西嗎?
意圖限制而又開後門。。。return 的對象中把person也返回不就行了謝邀
閉包的核心點是作用鏈的引用,
所以return person就可以了。
不知道為什麼會有這種需求javascript裡的閉包是設計成對外隱藏內部變數,這才是閉包安全性的意義所在,你現在要擷取它,,,,,什麼鬼
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.