成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你需要深入了解一下 JavaScript 的 new Function

開發 前端
JavaScript技術一直處于不斷發展壯大中,如果你是前端開發人員或者JavaScript開發工程師,那么,今天這個知識點,你有必要認真了解一下,它就是“new Function”。

1、語法

語法如下:

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

最后一個參數必須是函數體,其余參數作為傳遞給函數體的參數。

例如:

let sum = new Function('a', 'b', 'return a + b');
console.log(sum(1, 2)); // the result is 3

我們平時開發 JavaScript 或者 Node.js 的時候,沒有理由使用 new Function 構造函數,因為不需要直接使用函數或者 () => {} 箭頭函數。

這是否意味著 new Function 語法是一個雞肋的功能?

千萬不要這樣想! 因為它絕對不是你想的那樣!

new Function 語法有一個特別強大的特性,使它在 JavaScript 中發揮著不可替代的作用。

有什么特點?也就是函數體的數據格式是字符串,真是不可思議!

不可替代的角色

這里有幾個例子來展示 new Function 語法的微妙之處。

1).無效的 JSON 對象字符串合法化

例如,有以下字符串:

let str = `{ "id": 103, name: 'yh', 'date': '2022–07–06' }`;

其中的字符串不符合JSON格式(鍵值需要雙引號),使用JSON.parse()解析會報錯。

那么,有沒有什么辦法可以把這個字符串對象轉換成可以解析的JSON呢?

很多人會想到正則匹配然后替換,或者使用eval等渣屬性進行處理。

沒必要這么麻煩, new Function 上線了,就完美了!

JS 代碼如下所示:

console.log(JSON.stringify(new Function('return ' + str)()));
// The return result is: '{"id":10393,"name":"yh","date":"2022–07–06"}'

使用返回語法,你可以輕松地將任意字符串轉換為其他 JavaScript數據類型。

2).模板字符串作為模板

比如Vue、React等現在都有自己的模板語法,比如{}語法。

如果我們想直接使用 ES6 自己的語法作為模板語言,就必須使用 new Function 的能力,比如下面的 HTML:

<template id="template">
${data.map(function (obj, index) {
return `<p>Article: ${obj.article}</p>
<p>Author: ${obj.author}</p>
`;
}).join('')}
</template>

我們可以擴展字符串并定義一個名為 interpolate 的字符串方法來將 ES6 語法字符串轉換為可執行的 ES6 代碼:

String.prototype.interpolate = function (params) {
const names = Object.keys(params);
const vals = Object.values(params);return new Function(…names,`return \`${this}\`;`)(…vals);
};

至此,只要有對應的數據,我們就可以根據<template>模板獲取最終編譯好的HTML字符串,例如:

const html = template.innerHTML.interpolate({
data: [{
article: 'Article title one',
author: 'y'
}, {
article: 'Article title two',
author: 'h'
}]
});
console.log(html);

可以看出,無需任何第三方模板渲染引擎,就能使用復雜語法下的模板渲染效果,原生JS愛好者欣喜若狂。

3).閉包和上下文

new Function 的 body 參數中變量的上下文是全局的,不是私有的,沒有所謂的閉包。

例如,下面新函數代碼中的值與主函數中的值無關:

function getFunc() {
let value = 'yh';
let func = new Function('console.log(value)');
return func;
}
getFunc()(); // error: value is not defined

如果是常規函數語法,沒有問題:

function getFunc() {
let value = 'yh';
let func = function () {
console.log(value)
};
return func;
}
getFunc()(); // print 'yh'

4).其他

與 new Function 語法類似的是新的RegExp,它可以使用字符串作為正則表達式的內容,特別適合動態匹配,或者增加代碼混淆(一些混淆工具可以對字符串進行混淆)。

例如,要匹配以動態值開頭的屬性值,可以使用以下用法:

let reg = new RegExp('^' + value, 'g');

總結

以上就是我今天跟你分享的關于new Function語法的知識,希望對你有所幫助,如果你覺得有用的話,請記得點贊我,關注我,并將其分享給你身邊的朋友,也許能夠幫助到他。

最后,感謝你的閱讀,期待你的關注,我們一起快樂學編程。

責任編輯:龐桂玉 來源: web前端開發
相關推薦

2020-04-16 18:04:07

JavaScript前端技術

2019-03-11 14:33:21

Redis內存模型數據庫

2017-01-20 08:30:19

JavaScriptfor循環

2018-06-22 13:05:02

前端JavaScript引擎

2010-09-28 09:14:36

HTML DOMJavascript

2012-02-06 13:52:33

JavaScript

2017-09-22 14:12:33

Android字體 Typeface

2010-01-06 17:18:54

Linux常用軟件

2023-07-13 14:44:52

new Date()構造函數開發

2010-06-23 20:31:54

2010-07-13 09:36:25

2010-11-19 16:22:14

Oracle事務

2020-09-21 09:53:04

FlexCSS開發

2009-08-25 16:27:10

Mscomm控件

2022-08-26 13:48:40

EPUBLinux

2020-07-20 06:35:55

BashLinux

2019-11-07 15:20:07

JavaCollectorsteeing

2023-06-06 15:31:13

JavaScript開發

2019-08-02 08:59:21

Token認證服務器

2019-11-29 16:21:22

Spring框架集成
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 红桃视频一区二区三区免费 | 一本大道久久a久久精二百 国产成人免费在线 | 亚洲 欧美 日韩 在线 | 欧美国产日韩在线观看成人 | 羞羞的视频免费在线观看 | 国产精品久久久亚洲 | 日韩精品1区2区3区 国产精品国产成人国产三级 | 精品国产伦一区二区三区观看体验 | 成人免费观看视频 | 午夜伦理影院 | 中文字幕精品视频 | 日韩成人一区二区 | 黄色网址在线免费观看 | 精品一区二区三区在线视频 | 日韩一区二区在线视频 | 久草综合在线视频 | 9porny九色视频自拍 | 欧美精品一二三区 | 午夜在线视频一区二区三区 | 麻豆av在线免费观看 | 日本网站免费观看 | 国产精品久久久久久久久免费软件 | 成人字幕网zmw | 亚洲国产一区二区三区在线观看 | 天堂影院av | 久久精品91久久久久久再现 | 亚洲视频一区在线观看 | 精品久久免费 | 亚洲aⅴ | 国产成人午夜高潮毛片 | 欧美一极视频 | 伊人久久综合影院 | 欧洲精品久久久久毛片完整版 | 成人午夜电影在线观看 | 4h影视 | 久久三级av| 精品综合久久 | 黄色大片免费观看 | 日本久草| 91网站在线观看视频 | 国产成人精品久久 |