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裡的閉包是設計成對外隱藏內部變數,這才是閉包安全性的意義所在,你現在要擷取它,,,,,什麼鬼