Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
this.fullName = ko.computed(function() {
return this.firstName() + " " + this.lastName();
}, this);
forEach() можно задавать контекст:
[10, 20, 30].forEach(function(value, index, array){}, this)
var eventObject = { a: -99 };
document.addEventListener("click", eventObject);
eventObject.handleEvent = function(e){console.log(e.type, e, ++this.a)};
Тогда в старых скриптах возможно появление неожиданных ошибок
не надо. очень «весело» внутри catch-блока не меть доступа к переменным объявленным в try. а после for-in не иметь возможности узнать, что тело ни разу выполнено не было. var + короткие функции = куда более практично.Объявлять необходимые переменные на необходимом уровне? Например:
// Было
try {
let foo = fail();
} catch (e) {
// foo
}
// Стало
let foo;
try {
foo = fail();
} catch (e) {
// foo!
}
var f = function(x, y, z) {
console.log([x, y, z]);
};
// Частичное применение
var g = f.bind(null, 54);
g(2, 3); // => [54, 2, 3]
// Карринг
var h = function(x) {
return function(y) {
return function(z) {
f(x, y, z);
};
};
};
h(10)(20)(30); // => [10, 20, 30]
Function.prototype.curry=function(){
var fn=this,args=[];
return function cur(){
args.push.apply(args,arguments);
return fn.length>args.length?cur:fn.apply(this,args)
}
}
Function.prototype.part=function(){
var fn=this,args=[].slice.call(arguments);
return function(){
args.push.apply(args,arguments);
return fn.apply(this,args)
}
}
function fn(a,b,c,d){console.log(a+b+c+d)}
// каррирование
fn.curry()(1)(2,3)(4) // 10
// частичное применение (без смены контекста)
fn.part(1).part(2,3)(4) // 10
// .bind
fn.bind(null,1).bind(null,2,3)(4) // 10
def parse(enum)
processor = MetadataProcessor.new
reader = ->(dir_path) {processor.read_metadata dir_path}
saver = ->(metadata) {processor.save_metadata metadata if metadata}
loop do
EM.run_block do
enum.portion.each do |dir_path|
# EventMachine вызывает первый коллбэк без параметров,
# поэтому необходимо обернуть лямбду с параметром в замыкание.
EM.defer(reader.carry(dir_path), saver)
end
end
end
end
def parse(enum)
processor = MetadataProcessor.new
reader = ->(dir_path) {processor.read_metadata dir_path}
saver = ->(metadata) {processor.save_metadata metadata if metadata}
loop do
EM.run_block do
enum.each do |dir_path|
# EventMachine вызывает первый коллбэк без параметров,
# поэтому необходимо обернуть лямбду с параметром в замыкание.
reader_closure = ->() {reader.(dir_path)}
EM.defer(reader_closure, saver)
end
end
end
end
var array = [];
var i = 10;
while (i--) {
array.push(function() {
return i;
});
}
array[0](); // -1
array[1](); // -1
//... -1
var array = [];
var i = 10;
while (i--) {
array.push(function(i) {
return function() {
return i;
};
}(i));
}
array[0](); // 9
array[1](); // 8
// ...
var array = [];
var i = 10;
while (i--) {
let conter = i;
array.push(function() {
return conter;
});
}
array[0](); // 9
array[1](); // 8
// ...
lambda i = i: <текст функции>, в С++ — точными указаниями что и как замыкать.Не знаю, мне кажется, что плохо мешать парадигмы
function(x) x * x
В функциях добавилась возможность объявлять у параметров значения по умолчанию
for (var [, value] of Iterator(obj))
ECMAScript — это официальный стандарт языка JavaScript
ECMAScript стандартов много. Самый популярный из них — ECMA-262.
Предыдущие версии стандарта ECMA-262 были: ECMAScript 3, ECMAScript 4
ECMAScript 6 (кодовое имя ECMAScript.next) .
должен утвердиться до конца 2013 года
В текущей версии JavaScript присутствует функциональная область видимости
Стандарт один
Откуда такая информация?
— конец 2013 — feature freeze
— конец 2014 — финальная редакция
September is the end, otherwise we risk delaying for another 6 months. The final reviewing needs to be done between now and July.
var w = new WeakMap;
// Try to insert freezed object
var obj = {foo: 42};
Object.freeze(obj);
// -- Check
obj.bar = 101;
console.log(obj.bar); // undefined
// -- Insert to WeakMap
w.set(obj, 'baz');
console.log(w.get(obj)); // !!! undefined
// Try to insert regular extensible object
obj = {foo: 42};
// -- Check
obj.bar = 101;
console.log(obj.bar); // 101
// -- Try to insert to WeakMap
w.set(obj, 'baz');
console.log(w.get(obj)); // "baz"
… В ECMAScript 6 появятся классы…
… В JavaScript наконец-то появятся модули…
function foo({ from, to = 10 }) {
...
}
function foo({ from, to = 10 }) {
...
}
foo({ from: {bar:2, foo: 3}, to: 5 });
// Math.js
var Math = {};
Math.sum = function sum(x, y) {
return x + y;
}
Math.pi = 3.141593;
(function() {
// Не видна снаружи
function internal() {
...
}
})();
function() { return 100 } — это тоже лямбда-функция. А () => 100 — это новая форма записи. И ей нужно было дать какое-то более конкретное названиеfunction (a) {
if (a == null) a = 1;
}
* let — блочная область видимости (блок — фигурные скобки)
* аргументы по умолчанию (сахар)
* именованные аргументы (очень похоже на 1 хеш вмеесто ряда аргументов; оформлено как кругло-фигурные скобки ({...}) и комбинируется с позиционными аргументами)
* деструктуризация при присваивании (массивы и хеши), чувствительные и нечувствительные к ошибкам (оператор "?=")
* обёртка классов
* модули — require, import, вместо with
* for-of для собственных свойств
* yield
* стрелочные функции; неточное соответствие: не конструкторы, без this, без arguments
* .bind(): (x, y) => x + y + this.z === function (x, y) { return x + y + this.z }.bind(this)
Обзор ECMAScript 6, следующей версии JavaScript