Js的回傳值問題
今天看到網路上有一篇關於JS函數回傳值的問題了嗎,裡面有一些js函數的困難點。在那上面提了一下,關於js函數返回另一個函數的問題,並附上了一道面試題,我就給大家分享一下
[javascript] view plain copy var add = function(x){ var sum = 1; var tmp = function(x){ sum = sum + x; return tmp; } tmp.toString = function(){ return sum; } return tmp; } // alert(add(1)(2)(3)) --> 6
接下來,就來詳細的解讀返回另一個函數的問題。
其實我是從java轉過來的,一開始看到那篇文章,我對於返回另一個函數並沒有什麼認識,我之所以寫這篇文章是因為,在那裡面有一點讓我感到奇怪,那就是最後的呼叫方式
[javascript] view plain copy
add(1)(2)(3)
由於在java中,我沒有見過這樣的函數呼叫方式,所以引起了我的注意,我決定去研究研究;下面就將我的研究分享出來,當然如果你對此已經有了深刻的認識,你可以選擇跳過,或對於不足的地方,給予指點微笑。好了閒話不多說,進入正題。
我們來看一個最簡單的例子:
[javascript] view plain copy function create1(pro) { console.log("pro : " + pro); return function(obj1, obj2){ console.log(obj1 + " -- " + obj2); return obj1 + obj2; } }
我建立了一個簡單的函數create1,並且有一個回傳值,回傳值是一個內部函數。函數建構完了,接下來進行呼叫:
[javascript] view plain copy var c1 = create1("pro"); // 创建函数
如果按照我之前的理解,當我呼叫了這個方法後,應該會印出 pro : pro,接著然後報錯的。如果你看完過後,也跟我有一樣的想法,那恭喜你想太多了或者有了固型思維微笑
#。真實的是當我們透過上面的程式碼呼叫的時候,日誌是打印出了 pro : pro ,但是並沒有報錯,並且我們反覆來回的調用過後,也只是來回的打印相同的日誌。這也就說明這個時候,只是進入了create1()方法,並沒有進入到該函數的內部函數內。透過面試題的啟發,我在試著調用了一次,發現印出了後續的。
[java] view plain copy c1(1, 2); // 调用函数
這樣就列印出了下面的日誌;這說明其實我們一開始呼叫方法的時候,其實是並沒有進入到裡層的函數的,只是進入了外層函數體,我們只有再呼叫才能進入裡層函數體,而這個時候,我們重複上面的調用,他只會是調用裡層的函數體,並沒有外面的函數體。
類似這種函數返回另一個函數的,我們第一次調用只是構建了一個外層函數體對象,只有有後續的調用,才能調用內層函數體,並且重複調用,只會重複內層函數體。
不要急,還沒完,後面還有…
接下來,我們看另一種情況,我們先宣告一個函數,用來做加法運算:
[javascript] view plain copy function infun(obj1, obj2) { console.log(obj1 + " -- " + obj2); return obj1 + obj2; } 然后再声明一个函数,在该函数中调用上面声明的函数: [javascript] view plain copy function create2(pro) { console.log("pro = " + pro); return infun(obj1, obj2); // 这个时候,会报错 }
最後是呼叫:
[javascript] view plain copy var c1 = create2("pro");
查看日誌:
pro = pro Uncaught ReferenceError: obj1 is not defined
會發現,印出了一條日誌後,接著拋出了例外。對方法做一下改動,
[javascript] view plain copy function create2(pro) { console.log("pro = " + pro); var obj1 = 1, obj2 = 2; return infun(obj1, obj2); // 这个时候,会报错 }
在呼叫會發現正常運行,並且列印了兩個日誌記錄。
這說明,類似這種,在一個函數內回傳一個已經宣告的函數,其實是呼叫已經宣告的函數,跟上面的情況是不一樣的。
好了,現在回過頭來,仔細看看開頭的面試題,就會發現一切都明了了:
[javascript] view plain copy // 声明一个函数表达式 var add = function(x){ var sum = 1; // 在函数表达式内部有一个求和的内部函数 var tmp = function(x){ sum = sum + x;// 求和 return tmp; } // 构建一个函数体的toString()函数 tmp.toString = function(){ return sum; } return tmp; // 返回的是一个函数体,如果该函数体有toString()方法,则会调用函数体的toString()方法 }
然後再來看看呼叫:
[javascript] view plain copy alert(add(1)(2)(3))
結果為6,至於原因就跟我們第一種討論的情況一樣,接下來,我們反复調用:
[javascript] view plain copy // 以下结果输出为:6 alert(add(10)(2)(3)) alert(add(100)(2)(3)) // 下面的结果输出变了 alert(add(1)(3)(3)) alert(add(1)(2)(5))
#相信看了這些案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
相關閱讀:
#以上是Js的回傳值問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

熱門話題

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

PHP技巧:快速實現回到上一頁功能在網頁開發中,常常會遇到需要實作返回上一頁的功能。這樣的操作可以提高使用者體驗,讓使用者更方便地在網頁之間進行導航。在PHP中,我們可以透過一些簡單的程式碼來實現這項功能。本文將介紹如何快速實現返回上一頁功能,並提供具體的PHP程式碼範例。在PHP中,我們可以使用$_SERVER['HTTP_REFERER']來取得上一頁的URL

MySQL是一種廣泛使用的關聯式資料庫管理系統,用於儲存和管理資料。當我們想要往資料庫表中插入新的資料時,通常會使用INSERT語句來實作。在MySQL中,當執行INSERT語句成功插入資料時,會傳回一個結果,也就是插入操作的結果。在本文中,我們將詳細討論MySQL插入資料後傳回的結果,並提供一些具體的程式碼範例。 1.插入資料後回傳的結果在MySQL中,當成功執

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

解決jQuery.val()無法使用的問題,需要具體程式碼範例對於前端開發者,使用jQuery是常見的操作之一。其中,使用.val()方法來取得或設定表單元素的值是非常常見的操作。然而,在一些特定的情況下,可能會出現無法使用.val()方法的問題。本文將介紹一些常見的情況以及解決方案,並提供具體的程式碼範例。問題描述在使用jQuery開發前端頁面時,有時候會碰

不少用戶都嘗試更新了win11系統,結果發現更新完後開始選單無法使用了,這可能是因為最新的更新出現了問題,我們可以等待微軟修復或卸載這些更新來解決,下面就一起來看一下解決方法吧。 win11安裝後開始功能表無法使用怎麼辦方法一:1、先在win11中開啟控制面板。 2、然後點選程式下方的「卸載程式」按鈕。 3.進入卸載介面,在左上角找到「查看已安裝的更新」4、進入之後在更新資訊中可以查看更新時間,將最近的更新全部卸載即可。方法二:1、此外,我們還可以直接下載不含更新的win11系統。 2、這是一款沒有最
