成人免费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

2023-07-13 14:44:52

new Date()構造函數開發

2010-01-06 17:18:54

Linux常用軟件

2010-07-13 09:36:25

2010-11-19 16:22:14

Oracle事務

2020-09-21 09:53:04

FlexCSS開發

2022-08-26 13:48:40

EPUBLinux

2009-08-25 16:27:10

Mscomm控件

2010-06-23 20:31:54

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技術棧公眾號

主站蜘蛛池模板: 一区二区三区不卡视频 | 欧美九九 | 精品欧美一区二区三区久久久 | 在线看亚洲| 色本道| 黄色一级片在线播放 | 欧美精品在线观看 | 一级在线观看 | 国产婷婷 | 97超碰站 | 天天天插| 久久中文视频 | 久久小视频 | 91.色| 国产成人综合久久 | 亚洲另类视频 | 欧美日韩精品免费观看 | av免费网站在线观看 | 亚洲欧美视频一区 | 亚洲欧美中文日韩在线v日本 | 欧美人妇做爰xxxⅹ性高电影 | 欧美久久久 | 免费人成激情视频在线观看冫 | 中文字幕在线第一页 | 国产精品揄拍一区二区久久国内亚洲精 | 在线免费中文字幕 | 日韩在线观看网站 | a黄在线观看 | 男女网站视频 | 免费一级毛片 | 欧美精品1区2区 | 九九在线 | 国产91在线播放 | 久久久久亚洲视频 | 精品一区二区久久久久久久网精 | 国产这里只有精品 | 97超在线视频| 精品久久久网站 | 国产精品久久久久久久午夜片 | 成在线人视频免费视频 | 国产91在线播放精品91 |