JavaScript 如何获取闭包变量?

WBOY
發布: 2016-06-06 16:22:17
原創
1476 人瀏覽過

<span class="kd">var</span> <span class="nx">o</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
	<span class="kd">var</span> <span class="nx">person</span> <span class="o">=</span> <span class="p">{</span>   <span class="c1">//  let person  竟然也会被外部拿到 let 被打脸了啊</span>
		<span class="nx">name</span><span class="o">:</span> <span class="s1">'Vincent'</span><span class="p">,</span>
		<span class="nx">age</span><span class="o">:</span> <span class="mi">24</span><span class="p">,</span>
		<span class="nx">__proto__</span> <span class="o">:</span> <span class="kc">null</span> <span class="c1">// 是的你没有 看错 真的是 指向 null</span>
	<span class="p">};</span>
	<span class="k">return</span> <span class="p">{</span>
		<span class="nx">run</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">k</span><span class="p">)</span> <span class="p">{</span>
			<span class="k">return</span> <span class="nx">person</span><span class="p">[</span><span class="nx">k</span><span class="p">];</span>
		<span class="p">}</span>
	<span class="p">}</span>
<span class="p">}());</span>

<span class="c1">// 那么问题来了, 挖掘机技术 呸呸呸 说错了 口误! </span>
登入後複製

回复内容:

来抖个机灵。抖前先把正经的说了:

JavaScript的闭包是一种颇为紧密的封装。可以说,闭包是JavaScript在ES6的private Symbol之前唯一靠谱的“private”访问控制的实现方式。

在JavaScript层面没有任何办法可以通过闭包的函数对象取出闭包捕获的变量——除非该函数自己把它返回出来(或者用其它方式传递出来)。这样闭包就可以精确的控制自己想要暴露出来的信息量。

所以例如说:
<code class="language-js"><span class="kd">var</span> <span class="nx">o</span> <span class="o">=</span> <span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
  <span class="kd">var</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">1</span>
  <span class="kd">var</span> <span class="nx">b</span> <span class="o">=</span> <span class="mi">42</span>
  <span class="k">return</span> <span class="p">{</span>
    <span class="nx">foo</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
      <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span><span class="p">)</span>
      <span class="k">return</span> <span class="nx">b</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">})()</span>
</code>
登入後複製
我也来抖个机灵:IE9 下 __proto__ 是无效的呢。所以在 Object.prototype 上添加 getter 的方法在 IE9 下依然有效。 如果你引擎实现得好的话,那么——是做不到的。你可以试着用霍尔逻辑证明一下……
不过如果引擎不支持 __proto__(似乎 IE 很长时间都没支持),可以通过注入 Object.prototype 一个 getter 实现。 原来是面试题,js都被这么玩坏了。
明明是通过闭包实现的私有,那就让他私有好了,为毛要访问他呢,看着不爽就重构一下。 我们可以通过return一个函数来获取,具体看JS的闭包机制。 你是想问js是否有类似反射这种反设计的东西吗?
意图限制而又开后门。。。 return 的对象中把person也返回不就行了 谢邀
闭包的核心点是作用链的引用,
所以return person就可以了。
不知道为什么会有这种需求 javascript里的闭包是设计成对外隐藏内部变量,这才是闭包安全性的意义所在,你现在要获取它,,,,,什么鬼
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!