Baseline Widely available
Function()
æé 彿°å建 Function
对象ãç´æ¥è°ç¨æé 彿°å¯ä»¥å¨æåå»ºå½æ°ï¼ä½å¯è½ä¼é¢ä¸´ä¸äºå®å
¨æ§åç±»ä¼¼äº eval()
çæ§è½é®é¢ï¼ä½ç¸å¯¹è¾å°ï¼ãç¶èï¼ä¸å
·æè®¿é®æ¬å°ä½ç¨åç eval
ä¸åï¼Function
æé 彿°å建ç彿°ä»
å¨å
¨å±ä½ç¨å䏿§è¡ã
const sum = new Function("a", "b", "return a + b");
console.log(sum(2, 6));
// Expected output: 8
è¯æ³
new Function(functionBody)
new Function(arg0, functionBody)
new Function(arg0, arg1, functionBody)
new Function(arg0, arg1, /* â¦, */ argN, functionBody)
Function(functionBody)
Function(arg0, functionBody)
Function(arg0, arg1, functionBody)
Function(arg0, arg1, /* â¦, */ argN, functionBody)
夿³¨ï¼ è°ç¨ Function()
æ¶å¯ä»¥ä½¿ç¨æä¸ä½¿ç¨ new
ã两è
é½ä¼å建ä¸ä¸ªæ°ç Function
å®ä¾ã
argN
å¯é
è¢«å½æ°ç¨ä½å½¢åçåç§°ãæ¯ä¸ªåç§°é½å¿ é¡»æ¯å符串ï¼å¯¹åºäºä¸ä¸ªææç JavaScript åæ°ï¼ä»»ä½ä¸ä¸ªæ®éçæ è¯ç¬¦ãå©ä½åæ°æè§£æåæ°ï¼å¯éæ©ä½¿ç¨é»è®¤åæ°ï¼ï¼æç¨éå·åéçæ¤ç±»å符串çå表ã
ç±äºåæ°çè§£ææ¹å¼ä¸å½æ°è¡¨è¾¾å¼çè§£ææ¹å¼ç¸åï¼æä»¥æ¥å空ç½å注éãä¾å¦ï¼"x", "theValue = 42", "[a, b] /* numbers */"
æ "x, theValue = 42, [a, b] /* numbers */"
ãï¼"x, theValue = 42", "[a, b]"
乿¯æ£ç¡®çï¼è½ç¶æäºé¾ä»¥é
读ãï¼
functionBody
ä¸ä¸ªå 嫿æå½æ°å®ä¹ç JavaScript è¯å¥çå符串ã
ä½¿ç¨ Function
æé 彿°å建ç Function
对象ä¼å¨å½æ°å建æ¶å®æè§£æãè¿æ¯ç¨å½æ°è¡¨è¾¾å¼æå½æ°å£°æå建ä¸ä¸ªå½æ°å¹¶å¨ä»£ç ä¸è°ç¨å®çæçè¦ä½ï¼å 为使ç¨è¡¨è¾¾å¼æå£°æå建ç彿°ä¼åå
¶ä»ç代ç ä¸èµ·è¢«è§£æã
ä¼ éç»å½æ°çææåæ°ï¼é¤äºæåä¸ä¸ªï¼é½è¢«å½ä½è¦å建ç彿°ä¸åæ°çæ è¯ç¬¦çåç§°ï¼æç §å®ä»¬è¢«ä¼ éç顺åºè¿è¡å¤çãè¯¥å½æ°å°è¢«å¨æç¼è¯ä¸ºä¸ä¸ªå½æ°è¡¨è¾¾å¼ï¼å ¶æºä»£ç 以ä¸åæ¹å¼ç»è£ ï¼
`function anonymous(${args.join(",")}
) {
${functionBody}
}`;
è¿å¯ä»¥éè¿è°ç¨å½æ°ç toString()
æ¹æ³æ¥è§å¯ã
ç¶èï¼ä¸æ®éç彿°è¡¨è¾¾å¼ä¸åï¼anonymous
è¿ä¸ªååä¸ä¼è¢«æ·»å å° functionBody
çä½ç¨åä¸ï¼å 为 functionBody
åªè½è®¿é®å
¨å±ä½ç¨åã妿 functionBody
ä¸å¨ä¸¥æ ¼æ¨¡å¼ä¸ï¼ä¸»ä½æ¬èº«éè¦æ "use strict"
æä»¤ï¼å 为å®ä¸ä»ä¸ä¸æä¸ç»§æ¿ä¸¥æ ¼æ§ï¼ï¼ä½ å¯ä»¥ä½¿ç¨ arguments.callee
æ¥æä»£å½æ°æ¬èº«ãå¦å¤ï¼ä½ å¯ä»¥å°éå½é¨åå®ä¹ä¸ºä¸ä¸ªå
é¨å½æ°ï¼
const recursiveFn = new Function(
"count",
`
(function recursiveFn(count) {
if (count < 0) {
return;
}
console.log(count);
recursiveFn(count - 1);
})(count);
`,
);
请注æï¼éåæºçä¸¤ä¸ªå¨æé¨åââåæ°å表 args.join(",")
å functionBody
å°é¦å
被åå«è§£æï¼ä»¥ç¡®ä¿å®ä»¬å¨è¯æ³ä¸é½æ¯ææçãè¿å¯ä»¥é²æ¢ç±»ä¼¼æ³¨å
¥çå°è¯ã
new Function("/*", "*/) {");
// SyntaxError: Unexpected end of arg string
// ä¸ä¼åæ "function anonymous(/*) {*/) {}"
ç¤ºä¾ ä¸ Function æé 彿°ä¸åæå®åæ°
以ä¸ä»£ç å建äºä¸ä¸ªæ¥åä¸¤ä¸ªåæ°ç Function
对象ã
// æ¤ç¤ºä¾å¯å¨ä½ ç JavaScript æ§å¶å°ä¸è¿è¡
// å建ä¸ä¸ªæ¥åä¸¤ä¸ªåæ°ç彿°ï¼å¹¶è¿åè¿äºåæ°çå
const adder = new Function("a", "b", "return a + b");
// è°ç¨å½æ°
adder(2, 6);
// 8
åæ° a
å b
æ¯å¨å½æ°ä½ return a + b
ä¸ä½¿ç¨çæ£å¼åæ°åç§°ã
// 彿°æé å¨å¯ä»¥æ¥åå¤ä¸ªåå·åéçè¯å¥ãFunction 表达å¼éè¦å¸¦æå½æ°çè¿åè¯å¥
// è§å¯ä¸ä¸ï¼new Function 被è°ç¨äºãè¿æ ·æä»¬å°±å¯ä»¥å¨äºåç´æ¥è°ç¨æä»¬å建ç彿°äº
const sumOfArray = new Function(
"const sumArray = (arr) => arr.reduce((previousValue, currentValue) => previousValue + currentValue); return sumArray",
)();
// è°ç¨å½æ°
sumOfArray([1, 2, 3, 4]);
// 10
// å¦æä½ ä¸å¨åå»ºå½æ°æ¶è°ç¨ new Functionï¼ä½ å¯ä»¥ä½¿ç¨ Function.call() æ¹æ³æ¥è°ç¨å®
const findLargestNumber = new Function(
"function findLargestNumber (arr) { return Math.max(...arr) }; return findLargestNumber",
);
// è°ç¨å½æ°
findLargestNumber.call({}).call({}, [2, 4, 1, 8, 5]);
// 8
// 彿°å£°æä¸éè¦è¿åè¯å¥
const sayHello = new Function(
"return function (name) { return `Hello, ${name}` }",
)();
// è°ç¨å½æ°
sayHello("world");
// Hello, world
è§è æµè§å¨å
¼å®¹æ§ åè§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4