每个专业的JavaScript程序员应该知道什么
哈Ha!我们邀请课程“ JavaScript Developer。Professional”的未来学生参加有关“在NodeJs上创建交互式Telegram bot”主题的开放式网络研讨会。
我们还将分享有用文章的传统翻译。
每个程序员都可以编写函数。它们通常被称为一流对象,因为它们是JavaScript的关键概念。但是您知道如何有效使用它们吗?
今天,我将提供一些高级功能的提示。希望您发现它们有用。本文包含几个部分:
纯功能
高阶函数
功能缓存
懒函数
咖喱
功能组成
纯功能
什么是纯函数?
如果同时满足以下两个条件,则该函数被称为纯函数:
;
.
1
function circleArea(radius){
return radius * radius * 3.14
}
, . , . .
2
let counter = (function(){
let initValue = 0
return function(){
initValue++;
return initValue
}
})()
- , .
3
let femaleCounter = 0;
let maleCounter = 0;
function isMale(user){
if(user.sex = 'man'){
maleCounter++;
return true
}
return false
}
isMale
, , . maleCounter, .
?
? . , .
1. , .
. .
2. .
.
for (int i = 0; i < 1000; i++){
console.log(fun(10));
}
fun
, fun(10)
1000 .
fun
, . , , .
let result = fun(10)
for (int i = 0; i < 1000; i++){
console.log(result);
}
3. .
. assert , .
. 1.
const incrementNumbers = function(numbers){
// ...
}
:
let list = [1, 2, 3, 4, 5];
assert.equals(incrementNumbers(list), [2, 3, 4, 5, 6])
, , .
?
:
;
.
, .
, . , , .
:
const arr1 = [1, 2, 3];
const arr2 = [];
for (let i = 0; i < arr1.length; i++) {
arr2.push(arr1[i] * 2);
}
JavaScript map()
.
map
(callback) , .
const arr1 = [1, 2, 3];
const arr2 = arr1.map(function(item) {
return item * 2;
});
console.log(arr2);
map
— .
, . .
, :
function computed(str) {
// Suppose the calculation in the funtion is very time consuming
console.log('2000s have passed')
// Suppose it is the result of the function
return 'a result'
}
, , . ?
cached
. , , , . cached
, Object
Map
.
function cached(fn){
// Create an object to store the results returned after each function execution.
const cache = Object.create(null);
// Returns the wrapped function
return function cachedFn (str) {
// If the cache is not hit, the function will be executed
if ( !cache[str] ) {
let result = fn(str);
// Store the result of the function execution in the cache
cache[str] = result;
}
return cache[str]
}
}
:
, .
, «» , . .
, foo,
Date
, .
let fooFirstExecutedDate = null;
function foo() {
if ( fooFirstExecutedDate != null) {
return fooFirstExecutedDate;
} else {
fooFirstExecutedDate = new Date()
return fooFirstExecutedDate;
}
}
. , . - .
:
var foo = function() {
var t = new Date();
foo = function() {
return t;
};
return foo();
}
. — .
.
DOM - , IE. :
function addEvent (type, el, fn) {
if (window.addEventListener) {
el.addEventListener(type, fn, false);
}
else if(window.attachEvent){
el.attachEvent('on' + type, fn);
}
}
addEvent
. , :
function addEvent (type, el, fn) {
if (window.addEventListener) {
addEvent = function (type, el, fn) {
el.addEventListener(type, fn, false);
}
} else if(window.attachEvent){
addEvent = function (type, el, fn) {
el.attachEvent('on' + type, fn);
}
}
addEvent(type, el, fn)
}
, , , , . , .
— .
, , , ; — , .
?
.
. .
.
add
. .
function add(a,b,c){
return a + b + c;
}
( ) , , ( ).
add(1,2,3) --> 6
add(1,2) --> NaN
add(1,2,3,4) --> 6 //Extra parameters will be ignored.
?
:
function curry(fn) {
if (fn.length <= 1) return fn;
const generator = (...args) => {
if (fn.length === args.length) {
return fn(...args)
} else {
return (...args2) => {
return generator(...args, ...args2)
}
}
}
return generator
}
:
, , :
bitfish
,HELLO, BITFISH
, :
;
.
:
let toUpperCase = function(x) { return x.toUpperCase(); };
let hello = function(x) { return 'HELLO, ' + x; };
let greet = function(x){
return hello(toUpperCase(x));
};
, (greet
) . , greet
: fn3(fn2(fn1(fn0(x))))
.
compose
, :
let compose = function(f,g) {
return function(x) {
return f(g(x));
};
};
, greet
compose
:
let greet = compose(hello, toUpperCase);
greet('kevin');
compose
, , .
compose
, , .
underscore compose .
function compose() {
var args = arguments;
var start = args.length - 1;
return function() {
var i = start;
var result = args[start].apply(this, arguments);
while (i--) result = args[i].call(this, result);
return result;
};
};
, , .
- "JavaScript Developer. Professional".
- " Telegram NodeJs" .