Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 亚洲欧美一级久久精品,一区在线观看,中文字幕在线观看不卡

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          聊一聊JavaScript和Java、C#的“箭頭函數”

          S6 中引入了箭頭函數,這也是現在前端面試幾乎必考的內容(沒考箭頭函數,我都不好意思說自己是面試官,哈哈,開個玩笑)。有人問我,箭頭函數是個什么東西?我跟他說,就像Java和C#中的lambda。

          1. 舉個簡單的栗子:

          1.1 JavaScript

          let func = (s)=> { console.log(s); };

          func("hello world");

          1.2 Java

          interface Operate {

          void doSomething(String str);

          // void doSomething1(); 不可以有兩個方法

          }

          public static void main(String[] args) {

          Operate func = (String s)->{ System.out.println(s);};

          func.doSomething("hello world");

          }

          1.3 C#

          var func = (string s)=> { Console.WriteLine(s); };

          func("hello world");

          1.4 分析

          可以看到,寫法非常類似,尤其是Js和C#。 變量func可以被當做一個函數來使用。

          那么用于承接這個匿名方法的變量實際是什么?

          JavaScript: 就是一個js中的function

          Java: 在例子中,有點容易迷惑,明明是將lambda賦值給了一個接口類型。但最終調用的時候又要調用該接口的doSomething方法。而且這個接口只能有一個對應的方法,多了會報錯。

          Java10中也提供了var關鍵字,但遺憾的是也不能被用于這樣lambda賦值的情況。

          C#: 實際上是一個委托類型,例如:

          delegate void doSomething(string str);

          public static void Main(string[] args) {

          doSomething func = (string s) => { Console.WriteLine(s); };

          func("hello world");

          }

          這樣看和Java有點像了,但定義的仍然是一個方法,而不是一個接口中有一個同樣類型的方法。

          如果在c語言中我們會用一個指向函數的指針。

          2. 對函數外變量的引用

          在上一節的例子中,“hello world”是以參數的形式傳遞到方法中的,那么,是否可以直接引用外部的方法呢?

          當然是可以的,改造一下上面的例子:

          2.1 JavaScript

          let str = ",圣誕快樂。";

          let func = (s)=> {

          console.log(s + str);

          str = ",春節快樂。"

          };

          str = ",元旦快樂。"

          func("hello world");

          func("hello world");

          2.2 Java

          interface Operate {

          void doSomething(String str);

          // void doSomething1(); 不可以有兩個方法

          }

          public static void main(String[] args) {

          final String str = ",圣誕快樂";

          Operate func = (String s)->{

          System.out.println(s + str);

          //str = ",春節快樂。";

          };

          //str = ",元旦快樂。"

          func.doSomething("hello world");

          }

          2.3 C#

          var str = ",圣誕快樂。";

          var func = (string s) => {

          Console.WriteLine(s + str );

          str = ",春節快樂。";

          };

          str = ",元旦快樂。";

          func("hello world");

          func("hello world");

          2.4 分析

          • JavaScript 和C# 的結果是一樣的,輸出結果為:

          hello world,元旦快樂。

          hello world,春節快樂。

          可見,在函數執行的時候,會取當時str的值。在函數定義的時候,雖然引用了變量str,但不是此時固定了str的值。

          在函數中改變了str的值,會改變外部str的值。

          Java的例子中,要求str是final的才行,所以是無法對str改變的。

          3. 作為方法的參數

          在JavaScript中,經常會用到類似callback的回調方法,那么箭頭函數是不是也可以呢?

          3.1 JavaScript

          let func = (s)=> {

          console.log(s);

          };

          var showLog = function(str,action){

          action(str);

          }

          showLog("hello world",func);

          3.2 Java

          本例用Consumer代替了第一節中的自定義的Operate接口。其實Consumer就是框架幫我們預定義的泛型接口,避免我們總需自定義一個接口:

          public static void main(String[] args) {

          Consumer<String> func = (String s)->{

          System.out.println(s);

          };

          showLog("hello world",func);

          }

          public static void showLog(String str, Consumer<String> action){

          action.accept(str);

          }

          3.3 C#

          本例用Action代替了第一節中的自定義的delegate。其實Action就是框架幫我們預定義的泛型接口,避免我們總需自定義委托:

          public static void Main(string[] args)

          {

          var func = (string s) => { Console.WriteLine(s); };

          showLog("hello world", func);

          }

          public static void showLog(string str ,Action<string> action)

          {

          action(str);

          }

          4. 總結

          總體來說,三種語言的使用方法還是比較類似的。可能是都源于C的原因?

          其實對于面向對象語言來說,好多都是相通的,個人感覺經常對比一下,有助于加深記憶。

          另外,如果有機會,學一門風格和自己擅長的開發語言差異比較大的,更有利于對編程語言的了解。

          ————————————————

          版權聲明:本文為CSDN博主「FlyLolo」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。

          原文鏈接:https://blog.csdn.net/Lolo_cs_dn/article/details/122159246

          頭函數與普通函數的區別

          箭頭函數是在ES6中引入的。但箭頭函數不同于普通函數,箭頭函數提供了一種更為簡潔的語法形式。并且箭頭函數是沒有自己的this,它所謂的 this 是捕獲其所在上下?的 this 值,作為??的 this 值。而普通函數中的this指向是在運行時基于函數的執行環境綁定的,也就是動態的。

          如果 new 一個箭頭函數的會成功嗎

          首先我們了解一下new一個對象時會發生什么

          1. 創建一個對象
          2. 將構造函數的作用域賦給新對象(也就是將對象的__proto__屬性指向構造函數的 prototype 屬性)
          3. 指向構造函數中的代碼,構造函數中的 this 指向該對象(也就是為這個對象添加屬性和方法)
          4. 返回新的對象

          所以,上面的第二、三步,箭頭函數都是沒有辦法執行的。

          #如何學習編程##編程語言##前端##web前端面試題#

          點贊關注加收藏,每天都會更新一個JavaScript知識!!!!!!!!!


          主站蜘蛛池模板: 日韩精品视频一区二区三区| 国产午夜精品一区二区三区漫画| 亚洲AV无码一区二区三区牛牛| 国产午夜精品一区二区三区漫画 | 成人区人妻精品一区二区不卡网站| 日韩精品一区二区三区不卡| 四虎精品亚洲一区二区三区 | 国产精品99无码一区二区| 国产激情一区二区三区成人91| 亚洲熟女少妇一区二区| 亚洲美女一区二区三区| 国产精品va一区二区三区| 成人一区二区免费视频| 亚洲一区无码中文字幕乱码| 国产精品视频免费一区二区| 爆乳熟妇一区二区三区霸乳| 色婷婷一区二区三区四区成人网| 激情无码亚洲一区二区三区| 国产亚洲一区区二区在线| 亚洲熟妇AV一区二区三区宅男| 狠狠爱无码一区二区三区| 亚洲午夜精品一区二区| 精品国产日韩亚洲一区在线 | 色偷偷av一区二区三区| 精品理论片一区二区三区| 国产精品视频一区二区噜噜| 怡红院一区二区三区| 国产免费无码一区二区| 韩国一区二区三区| 无码一区二区三区| 亚洲国产综合精品一区在线播放| 亚洲高清美女一区二区三区| 一区二区免费电影| 国产一区二区在线| 国产精品视频一区二区三区| 精品aⅴ一区二区三区| 国产aⅴ精品一区二区三区久久| 蜜臀AV一区二区| 自慰无码一区二区三区| 丰满岳乱妇一区二区三区| 一区二区和激情视频|