欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ES6中new Function()語法及應用實例分析

 更新時間:2020年02月19日 12:44:36   作者:true!  
這篇文章主要介紹了ES6中new Function()語法及應用,結合實例形式分析了ES6中new Function()的基本語法、功能、原理、閉包等相關使用技巧,需要的朋友可以參考下

本文實例講述了ES6中new Function()語法及應用。分享給大家供大家參考,具體如下:

學習《ECMAScript6入門》中的模板字符串的案例中看見了new Function()創(chuàng)建函數的語法:

let str = 'return ' + '`Hello ${name}!`';
let func = new Function('name', str);
func('Jack') // "Hello Jack!"

上面的代碼傳入name參數和字符串函數體,字符串函數體由模板字符串提供,非常簡潔方便。

為理解new Function,于是找到了下面這篇文章:

下文翻譯自:https://javascript.info/new-function

這里有一個很少被用到的新建函數的方法,但是有時候不得不使用它。

語法

新建函數的語法:

let func = new Function ([arg1[, arg2[, ...argN]],] functionBody)

換句話說,函數的參數(或更確切地說,各參數的名稱)首先出現(xiàn),而函數體在最后。所有參數都寫成字符串形式。

通過查看示例,可以更容易理解。這是一個有兩個參數的函數:

let sum = new Function('a', 'b', 'return a + b');
alert( sum(1, 2) ); // 3

如果所要新建的函數沒有參數,那么new Function()只有一個函數體參數:

let sayHi = new Function('alert("Hello")');
sayHi(); // Hello

這個方式與其他方式最主要的不同點在于,函數是由在運行時傳入的字符串創(chuàng)建的。

之前的所有聲明都要求程序員在腳本中編寫功能代碼。

但new Function允許將任何字符串轉換為函數。例如,我們可以從服務器接收新函數然后執(zhí)行它:

let str = ... receive the code from a server dynamically ...
let func = new Function(str);
func();

它在非常特殊的情況下使用,例如當我們從服務器接收代碼時,或者使用模板動態(tài)編譯函數。對此的需求通常出現(xiàn)在開發(fā)的進階階段。

閉包(Closure)

通常,函數將它所創(chuàng)建的位置記錄在特殊屬性[[Environment]]中。 它引用了創(chuàng)建地點的詞法環(huán)境。

但是當使用new Function()創(chuàng)建函數時,其[[Environment]]不是引用當前的詞法環(huán)境,而是引用全局環(huán)境。

function getFunc() {
 let value = "test";
 let func = new Function('alert(value)');
 return func;
}
getFunc()(); // error: value is not defined

與常規(guī)方法比較:

function getFunc() {
 let value = "test";
 let func = function() { alert(value); };
 return func;
}
getFunc()(); // "test", 來自getFunc的詞法環(huán)境

這個特殊的new Function表面看起來很奇怪,但在實踐中顯得非常有用。

想象一下,我們必須從字符串創(chuàng)建一個函數。在編寫腳本時不知道該函數的代碼(這就是我們不使用常規(guī)函數的原因),但在執(zhí)行過程中將會知道。我們可能會從服務器或其他來源收到它。

我們的新函數需要與主腳本進行交互。

也許我們希望它能夠訪問外部的局部變量?

問題是在JavaScript發(fā)布到生產之前,它是使用minifier壓縮的——一個通過刪除額外的注釋,空格來縮小代碼的特殊程序,而且 - 重要的是,會將局部變量重命名為較短的變量。

例如,如果一個函數中有l(wèi)et userName,那么minifier會替換它為let a(或者如果a被占用,則用另一個字母替換),這個過程會在任何地方進行。這通常是一件安全的事情,因為被替換的變量是局部的,函數外部沒有任何東西可以訪問它。并且在函數內部,minifier取代了它的每一個提及。Minifiers很聰明,他們會分析代碼結構,所以他們不會破壞任何東西。他們不是只會愚蠢地發(fā)現(xiàn)和替換。

但是,如果new Function可以訪問外部變量,那么它將無法找到userName,因為userName在代碼縮小后才作為字符串傳入。

所以,即使我們可以在new Function中訪問外部詞匯環(huán)境,我們也會遇到minifiers的問題。

而這時,new Function的“特色”可以讓我們免于犯錯。

它強制執(zhí)行更好的代碼。如果我們需要將某些東西傳遞給由new Function創(chuàng)建的函數,我們應該將它作為參數顯式傳遞(可以避免直接讀取外部變量時產生的問題)。

我們的“sum”函數實際上是這樣正確使用的:

let sum = new Function('a', 'b', 'return a + b');
let a = 1, b = 2;
// 外部變量作為參數傳入
alert( sum(a, b) ); // 3

總結

語法:

let func = new Function(arg1, arg2, ..., body);

歷史原因,參數也可以以逗號分隔的列表的形式給出。

這三個意思相同:

new Function('a', 'b', 'return a + b'); // 基礎語法
new Function('a,b', 'return a + b'); // 逗號分隔
new Function('a , b', 'return a + b'); // 逗號加空格分隔

使用new Function創(chuàng)建的函數,其[[Environment]]引用全局詞法環(huán)境,而不是包含該函數的外部詞法環(huán)境。因此,他們不能使用外層的變量。但這確實很好,因為它可以使我們免于錯誤。明確地傳遞參數在架構上是一種更好的方法,并且不會在使用minifiers時不會產生問題。

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。

更多關于JavaScript相關內容可查看本站專題:《JavaScript操作DOM技巧總結》、《JavaScript頁面元素操作技巧總結》、《JavaScript事件相關操作與技巧大全》、《JavaScript查找算法技巧總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript錯誤與調試技巧總結

希望本文所述對大家JavaScript程序設計有所幫助。

相關文章

  • JavaScipt中棧的實現(xiàn)方法

    JavaScipt中棧的實現(xiàn)方法

    這篇文章主要介紹了JavaScript數據結構與算法之棧詳解,本文講解了對棧的操作、對棧的實現(xiàn)實例等內容,需要的朋友可以參考下
    2016-02-02
  • JavaScript直接調用函數與call調用的區(qū)別實例分析

    JavaScript直接調用函數與call調用的區(qū)別實例分析

    這篇文章主要介紹了JavaScript直接調用函數與call調用的區(qū)別,結合額實例形式分析了JavaScript直接調用函數與call調用的基本用法、區(qū)別及相關注意事項,需要的朋友可以參考下
    2020-05-05
  • JavaScript中arguments和this對象用法分析

    JavaScript中arguments和this對象用法分析

    這篇文章主要介紹了JavaScript中arguments和this對象用法,結合實例形式較為詳細的分析了arguments對象和this對象的功能、常見用法及相關操作注意事項,需要的朋友可以參考下
    2018-08-08
  • video.js 一個頁面同時播放多個視頻的實例代碼

    video.js 一個頁面同時播放多個視頻的實例代碼

    這篇文章主要介紹了video.js 一個頁面同時播放多個視頻的實例代碼 ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-11-11
  • JS ES6多行字符串與連接字符串的表示方法

    JS ES6多行字符串與連接字符串的表示方法

    這篇文章主要介紹了JS ES6多行字符串與連接字符串的表示方法,結合具體實例形式對比分析了ES6中的多行字符串與連接字符串的表示方法與相關操作技巧,需要的朋友可以參考下
    2017-04-04
  • 淺析Javascript ES6新增值比較函數Object.is

    淺析Javascript ES6新增值比較函數Object.is

    在Javascript中判斷相等是很常見的,常用的判斷有“==”,“===”,“!=”,“!==”,今天這篇文章我們來學習ES6中的一個方法Object.is(),有需要的可以參考學習。
    2016-08-08
  • JavaScript 閉包機制詳解及實例代碼

    JavaScript 閉包機制詳解及實例代碼

    這篇文章主要介紹了JavaScript 閉包機制詳解及實例代碼的相關資料,需要的朋友可以參考下
    2016-10-10
  • 詳解微信小程序開發(fā)之下拉刷新 上拉加載

    詳解微信小程序開發(fā)之下拉刷新 上拉加載

    本篇文章主要介紹了微信小程序開發(fā)之下拉刷新 上拉加載,具有一定的參考價值,有興趣的可以了解一下。
    2016-11-11
  • JS事件循環(huán)機制event loop宏任務微任務原理解析

    JS事件循環(huán)機制event loop宏任務微任務原理解析

    這篇文章主要介紹了JS事件循環(huán)機制event loop宏任務微任務原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • JavaScript數據結構鏈表知識詳解

    JavaScript數據結構鏈表知識詳解

    存儲有序的元素集合,但不同于數組,鏈表中的元素在內存中不是連續(xù)放置的。每個元素由一個存儲元素本身的節(jié)點和一個指向下一個元素的引用(也稱指針或鏈接)組成。下面通過本文給大家詳細介紹下,需要的朋友參考下
    2016-11-11

最新評論