目錄
回复内容:
首頁 後端開發 Python教學 JavaScript 如何获取闭包变量?

JavaScript 如何获取闭包变量?

Jun 06, 2016 pm 04:22 PM
function null return var

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

所以例如说:
<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>
登入後複製
我也来抖个机灵:IE9 下 __proto__ 是无效的呢。所以在 Object.prototype 上添加 getter 的方法在 IE9 下依然有效。 如果你引擎实现得好的话,那么——是做不到的。你可以试着用霍尔逻辑证明一下……
不过如果引擎不支持 __proto__(似乎 IE 很长时间都没支持),可以通过注入 Object.prototype 一个 getter 实现。 原来是面试题,js都被这么玩坏了。
明明是通过闭包实现的私有,那就让他私有好了,为毛要访问他呢,看着不爽就重构一下。 我们可以通过return一个函数来获取,具体看JS的闭包机制。 你是想问js是否有类似反射这种反设计的东西吗?
意图限制而又开后门。。。 return 的对象中把person也返回不就行了 谢邀
闭包的核心点是作用链的引用,
所以return person就可以了。
不知道为什么会有这种需求 javascript里的闭包是设计成对外隐藏内部变量,这才是闭包安全性的意义所在,你现在要获取它,,,,,什么鬼
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

C語言return的用法詳解 C語言return的用法詳解 Oct 07, 2023 am 10:58 AM

C語言return的用法有:1、對於傳回值類型為void的函數,可以使用return語句來提前結束函數的執行;2、對於傳回值型別不為void的函數,return語句的作用是將函數的執行結果傳回給呼叫者;3、提前結束函數的執行,在函數內部,我們可以使用return語句來提前結束函數的執行,即使函數並沒有回傳值。

function是什麼意思 function是什麼意思 Aug 04, 2023 am 10:33 AM

function是函數的意思,是一段具有特定功能的可重複使用的程式碼區塊,是程式的基本組成單元之一,可以接受輸入參數,執行特定的操作,並傳回結果,其目的是封裝一段可重複使用的程式碼,提高程式碼的可重複使用性和可維護性。

Java中return和finally語句的執行順序是怎樣的? Java中return和finally語句的執行順序是怎樣的? Apr 25, 2023 pm 07:55 PM

原始碼:publicclassReturnFinallyDemo{publicstaticvoidmain(String[]args){System.out.println(case1());}publicstaticintcase1(){intx;try{x=1;returnx;}finally{x=3;}}#輸出上述程式碼的輸出可以簡單地得出結論:return在finally之前執行,我們來看下字節碼層面上發生了什麼事情。下面截取case1方法的部分字節碼,並且對照源碼,將每個指令的含義註釋在

c語言中null和NULL的差別是什麼 c語言中null和NULL的差別是什麼 Sep 22, 2023 am 11:48 AM

c語言中null和NULL的差異是:null是C語言中的一個宏定義,通常用來表示一個空指針,可以用來初始化指針變量,或是在條件語句中判斷指針是否為空;NULL是C語言中的一個預先定義常數,通常用來表示一個空值,用來表示一個空的指標、空的指標數組或是空的結構體指標。

undefined和null是什麼意思 undefined和null是什麼意思 Nov 20, 2023 pm 02:39 PM

在JavaScript 中,undefined和null都代表著「無」的概念:1、undefined 表示一個未初始化的變數或一個不存在的屬性,當宣告了一個變數但沒有對其賦值時,這個變數的值就是undefined ,當存取物件中不存在的屬性時,傳回的值也是undefined;2、null表示一個空的物件引用,在某些情況下,可以將物件的引用設為null,以便釋放其佔用的記憶體。

什麼時候用null和undefined 什麼時候用null和undefined Nov 13, 2023 pm 02:11 PM

null和undefined都表示缺少值或未定義的狀態,根據使用場景的不同,選擇使用null或undefined有以下一些指導原則:1、當需要明確指示一個變數為空或無效時,可以使用null;2、當一個變數已經宣告但尚未賦值時,會被預設為undefined;3、當需要檢查一個變數是否為空或未定義時,使用嚴格相等運算子「===」來判斷變數是否為null或undefined 。

null和undefined有什麼不同 null和undefined有什麼不同 Nov 08, 2023 pm 04:43 PM

null和undefined的差異在:1、語意意義;2、使用場景;3、與其它值的比較;4、與全域變數的關係;5、與函數參數的關係;6、可空性檢定;7、性能考慮;8、在JSON序列化中的表現;9、與類型的關係。詳細介紹:1、語意意義,null通常表示知道這個變數不會擁有任何有效的物件值,而undefined則通常表示變數未被賦值,或物件沒有此屬性;2、使用場景等等。

'enumerate()'函數在Python中的用途是什麼? 'enumerate()'函數在Python中的用途是什麼? Sep 01, 2023 am 11:29 AM

在本文中,我們將了解enumerate()函數以及Python中「enumerate()」函數的用途。什麼是enumerate()函數? Python的enumerate()函數接受資料集合作為參數並傳回一個枚舉物件。枚舉物件以鍵值對的形式傳回。 key是每個item對應的索引,value是items。語法enumerate(iterable,start)參數iterable-傳入的資料集合可以作為枚舉物件傳回,稱為iterablestart-顧名思義,枚舉物件的起始索引由start定義。如果我們忽

See all articles