Pull to refresh

Comments 28

Где ещё почитать про синтаксис javascript;version=1.7 и область его применимости в браузерах?

В FF3.6 заработал, а где ещё такая странная запись будет работать и каковы перспективы для неё?

Впрочем, там работает и

, что тоже не обычно. С какой это версии JS пошло и почему так не пишут, а обычно f = function(x){return x*x;}?
[Съедены теги:]
В FF3.6 заработал
<script type="application/javascript;version=1.7">let(f = function(x)(x*x))alert(f(4));</script>
, а где ещё такая странная запись будет работать и каковы перспективы для неё?

Впрочем, там работает и
<script>
f = function(x)(x*x);
alert(f(4))
</script>
, что тоже не обычно. С какой это версии JS пошло и почему так не пишут, а обычно f = function(x){return x*x;}?
Такая запись функций пошла с 1,7 версии.
Не пишут так потому что 1)Не все знают 2)Internet Explorer
Основные перспективы использования let — это node.js
Почитать про JavaScript можно на MDC
Где работает с уверенностью сказать не могу но насколько я знаю IE8+, Chrome,FireFox (версии не указал так как пользователи этих браузеров обычно обновляют его) поддерживают 1.7 версию.
Нет, кроме лисы ни один популярный браузер не поддерживает.
В node.js let, array comprehensions и closure expression у меня не заработали =( Есть способ запустить?
В V8 нет let и поэтому его нет в Node.js
let is a Mozilla extension, not part of any standard
Аналогично с E4X (хотя он в стандарте)
There are currently no plans for implementing E4X in V8
Comparison_of_layout_engines_(ECMAScript)
Javascript — это имплементация стандарта ECMAscript корпорацией Mozilla. Следовательно, в других браузерах (вообще ни в одном, базирующемся на Webkit, Presto, Trident) поддержки let нету. Я как-то заводил баг в багтрекере V8 — там мне сказали то же самое «извините, но новые фичи не включим, пока они не будут в ecmascript».
Ответвление Javascript, поддерживаемое мозиллой добавляет еще такие фичи:
— Короткие анонимные функции
Было: function(x) {return x * x}
Стало: function(x) x * x
— Генераторы, итераторы (__iterator__, next()) и, следовательно, yield statement, как в пытоне
function fib() { // js 1.7
  var i = 0, j = 1;
  while (true) {
    yield i;
    var t = i;
    i = j;
    j += t;
  }
}

handleResults( i for ( i in obj ) if ( i > 3 ) ); // js 1.8


— Списочные выражения (тоже из пытона)
var ten_squares = [i * i for each (i in range(0, 10))];
var evens = [i for each (i in range(0, 21)) if (i % 2 == 0)];

— Destructing assignment
var a = 1;
var b = 3;
[a, b] = [b, a];
function f() {
  return [1, 2];
}

var c, d = f();
Ну тогда я пожалуй напишу компилятор данного подмножества JS в JS для V8, Preso,…
Было бы здорово, но как будет выглядеть тогда разработка? Будет что-то типа Coffeescript — пишешь код, компилируешь, вставляешь в js-файл и смотришь?
Две версии.
1) Как Coffescript
2) JIT с подключением extend.js
Маленькая поправочка, Webkit, Presto, Trident — это движки, которые рендерят НТМЛ. За джаваскрипт отвечает JS движок.

Еще я бы добавил к вашему списку такую вещь:
Object.__noSuchMethod__ — вызывается, если метод не существует. Ну вот почему именно этой фичи нет в V8, когда она так мне нужна в node.js -_-

Ссылка на работающий пример в вашей статье смотрелась бы как нельзя кстати.
Спасибо за совет, работающие примеры добавил.
Последний пример, скорее всего, с ошибкой. В том же FF сравните:
<script type="application/javascript;version=1.7">
let f = 1
	{alert(f);} //вывод 1
	alert(f); //вывод 1
</script>

и
<script type="application/javascript;version=1.7">
let(f = 1)
	{alert(f);} //вывод 1
	alert(f); //ошибка "f is not defined"
</script>
Поясните пожалуйста в чем ошибка. Так как пробовал все из веб консоли FF 4.0 Beta 10 и все работало как я расписал.
Ограничение видимости работает именно во 2-м моём примере, когда после let — скобки. В первом случае оператор let, скорее всего, просто игнорируется. Ещё пример:
<script type="application/javascript;version=1.7">
let(f = 1)
	alert(window.f); //undefined - правильно
	alert(f); //ошибка "f is not defined" - тоже правильно
</script>

Поэтому Ваш пример
let i=100
{

не сработает по ограничению видимости.
Т.е работать, конечно, будет, но i==100 останется и после фигурных скобок после блока.
А какое тогда отличие от просто
i=100
{

? Даже область видимости переменной i в этом случае — windows.
Вот именно что отличий нет, в том примере внешняя область видимости для кода в блоке не важна. Важно то что когда мы определяем внутри let i = i *i то сначала i становится undefined во внутренней области.
а в let m = i * i мы определяем m а затем присваиваем m значения в результате умножения i*i из внешней области видимости.
Потому что в JavaScript областью видимости управляет только функция.
Последний пример должен выглядеть так:

let i=100;
(function(){
let i = i * i;
Bob.say(i);
})();
если правильно понял, то в первом примере вместо
Bob.postmessage("300$",event.origin)

должно быть
Bob.postmessage(price+"$",event.origin)
Да вы правильно поняли, спасибо, ошибку исправил.
а поямните первый пример
в эту функцию вы прайс не передаете?
Bob.buy('dream plug');
т.е. эта фунция работает с глобальным объектом прайс
то есть получается что let на время переопределяет глобальную переменную?
К сожалению тесты показали что не переопределяет, следовательно у меня ошибка в примере, сейчас я её исправлю.
Sign up to leave a comment.

Articles