// rollup.config.js
import { nodeResolve } from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
export default {
external: [/node_modules/],
input: {
core: 'src/core',
all: 'src/all',
},
output: {
dir: 'dist',
format: 'cjs',
entryFileNames: '[name].js',
},
plugins: [commonjs(), nodeResolve()],
};
g.bind(t, x)
условно эквивалентноfunction (a) {
return g.call(t, x, a);
}
Function.apply
не то же самое, что Function.prototype.apply
. Но в рассматриваемом случае, как мы увидим, они взаимозаменяемы, потому что их значения совпадают (указывают на одну функцию с одним кодом).Function.apply.bind(f, null)
возвращает функцию, грубо говоря (потому что неявно предполагается, что эта функция в будущем будет вызвана ровно с одним аргументом), такого видаfunction (a) {
return Function.apply.call(f, null, a);
}
что условно (потому что здесь происходит изменение f
как объекта; в действительности, вызывается apply
с this=f
) эквивалентноfunction (a) {
f.apply = Function.apply;
return f.apply(null, a);
}
Поскольку функция f при нормальных обстоятельствах наследует тот же apply, что и Function, Function.apply.apply(f, null, a)
полностью эквивалентно f.apply(null, a)
.function (a) {
return f.apply(a);
}
то есть a
будет передано как this
.function foo(bar,baz) {
var x = bar * baz;
return [
Promise.resolve(x),
Promise.resolve(x*2 )
];
}
Promise.all(
foo( 10, 20 )
)
.then( Function.apply.bind(
function() {
console.log( this[0], this[1] );
}
) );
А есть ли смысл указывать для дочернего объекта конструктор прототипа, я так понимаю это только ссылка на функцию, и если его необязательно использовать?У каждого конструктора есть прототип. По умолчанию это Object.prototype.
Как лучше всего добавлять в прототип свои свойстваЯ не знаю. ИМХО, для прикладных задач лучше делать так, чтоб читало проще.
Как лучше добавлять свои методы, вариант только так, или есть более элегантное решение, например создать объект со своими методами и склеить его с прототипом?Без разницы, но нужно учитывать один момент.
Unhandled Error: String.prototype.toString: this is not a String object
String.prototype.toString = function() {
if (typeof this === 'string')
return this.valueOf();
else
throw new TypeError();
};
promise
разрешается с не-промисным значением value
, то promise.then(value => value)
и promise.then(value => Promise.resolve(value))
эквивалентны promise в приведённой выше цепочке.promise.then(value => value)
и promise.then(value => Promise.resolve(value))
эквивалентны: они вернут промис, который разрешается со значением, с которым разрешается value
.// условие, когда нужно исполнить функцию и завершить процесс
function readIsOK(read) {
return read != last_read;
}
// какие-то осмысленные действия, когда условие удовлетворяется
function doSomething(result) {
if (last_read < result) {
//...тут какой-то код
} else if (last_read > result) {
// ...тут какой-то код
}
}
// функция, которая запускает процесс
function start() {
// функция, которая ежесекундно проверяет условие
// если условие выполняется, делает полезное действие
// иначе процесс продолжается до следующего вызова checkRead
function checkResult() {
var result = getRead();
if(readIsOK(result)) doSomething(result);
setTimeout(checkResult, 1000);
}
// запускаем первую итерацию
checkResult();
}
start();
// условие, когда нужно исполнить функцию и завершить процесс
function readIsOK(read) {
return read != last_read;
}
// какие-то осмысленные действия, когда условие удовлетворяется
function doSomething(result) {
if (last_read < result) {
//...тут какой-то код
} else if (last_read > result) {
// ...тут какой-то код
}
}
// функция, которая запускает процесс
function start(callback) {
// функция, которая ежесекундно проверяет условие
// если условие выполняется, делает полезное действие
// иначе процесс продолжается до следующего вызова checkRead
function checkResult() {
var result = getRead();
if(readIsOK(result)) callback(result);
setTimeout(checkResult, 1000);
}
// запускаем первую итерацию
checkResult();
}
start(doSomething);
start(() => start(() => alert("hi!")));
function adjacentElementsProduct (inputArray) {
return inputArray
.sort()
.slice(-2)
.reduce((total, num) => total * num);
}
function adjacentElementsProduct (inputArray) {
const [ x, y ] = inputArray
.sort()
.slice(-2);
return x * y;
}
/**
* @namespace ZZZ
*/
(function() {
/** @lends ZZZ */
/**
* my function.
*/
function f() {
}
/**
* my variable.
*/
var x = 2;
})();
/**
* @namespace ZZZ
*/
(/** @lends ZZZ */function() {
/**
* my function.
*/
function f() {
}
/**
* my variable.
*/
var x = 2;
})();
/** @module ZModule */
(function() {
/**
* an array of instances.
* @memberof module:ZModule
*/
var instances = [];
/**
* retrieve an instance.
* @memberof module:ZModule
* @return an instance
*/
function getInstance() { return instance[0]; }
/**
* Constructor of a new instance.
* @memberof module:ZModule
* @class module:ZModule.createInstance
*/
function createInstance() {
return /** @lends module:ZModule.createInstance# */ {
/**
* param.
*/
objParam1: 42,
/**
* method.
* @return an integer
*/
objMethod1: function() { return 24; }
}
}
window.myModules.myModule1 = {
instances: instances,
createInstance: createInstance,
getInstance: getInstance
}
})();
// цикле без if-условия
kompListItem[i].onclick = function() {
if (this.parentNode.className !== 'added-to-table')
return present.call(this);
else
return udalitCol.call(this);
};
for(k in { x: 1, y: 2 }) { ... }