Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Я нашел скрытый бонус JavaScript (https://javascript.ru/forum/misc/17549-ya-nashel-skrytyjj-bonus-javascript.html)

Solovei95 24.05.2011 10:20

Я нашел скрытый бонус JavaScript
 
for(i=0;i<3;i++){

window.setTimeout(function(i){
alert("test"+i);
},1000,i);

}


т.е. параметр i обязателен!

Solovei95 24.05.2011 10:24

Аналогично
window.addEventListener("load",function(i){
alert("test"+i);
}(i),false);

Sweet 24.05.2011 10:46

Цитата:

Сообщение от Solovei95
Аналогично

Абсолютно не аналогично. А насчет SetTimeout - тут ie все обламывает, так же, как и, например, это:
test = true,
function(x){
  var test = x;
  eval.call(window, "alert(test)");
}(false); // скрытый бонус)))

Solovei95 24.05.2011 11:33

Только этот бонус не работает, как цикл находиться внутри функции

Sweet 24.05.2011 11:52

Цитата:

Сообщение от Solovei95
Только этот бонус не работает, как цикл находиться внутри функции

Что, простите?:)

Solovei95 24.05.2011 12:22

Я уже решил проблему!

monolithed 24.05.2011 13:14

Цитата:

Сообщение от Sweet
скрытый бонус

по-моему так проще:
test = true,
function(x) {
  var test = x;
  alert(window.test);
}(0);

:)

Sweet 24.05.2011 13:53

monolithed, мне просто вспомнилось, как когда-то мне надо было эвалить ( я был молод, горяч и любил эвалить:D ) скрипты. Но так как эвал происходит в текущем контексте, переменные оказывались не там, где надо:
(function(){
  eval("var test = true;");
}());
alert("test" in window);
Тогда я решил проблему так:
(function(){
  eval.call(window, 'var test = true;');
}());
alert("test" in window);
А потом я неожиданно узнал, что в ie так не получится. Тогда мне помог execScript, но с тех пор я понял: нашел "скрытый бонус", первым делом опробуй его в ie!:)

FINoM 24.05.2011 17:55

Цитата:

Сообщение от Solovei95 (Сообщение 105882)
for(i=0;i<3;i++){

window.setTimeout(function(i){
alert("test"+i);
},1000,i);

}

А что этот пример возвращает в консоли? Не могу понять.


Кстати, в setTimeout можно передавать больше одного аргумента.

Sweet 24.05.2011 18:24

Цитата:

Сообщение от FINoM
А что этот пример возвращает в консоли?

Идентификаторы timeout-ов наверное.
Цитата:

Сообщение от FINoM
в setTimeout можно передавать больше одного аргумента.

Если это имеет значение, несмотря на некроссбраузерность, то проверить не проблема:
setTimeout(function(){
  alert( arguments.length );
}, 1, 1, 2, 3);

FINoM 24.05.2011 18:47

Цитата:

Сообщение от Sweet
Идентификаторы timeout-ов наверное.

Точно.
Цитата:

Сообщение от Sweet
Если это имеет значение, несмотря на некроссбраузерность, то проверить не проблема

Это был не вопрос :)

Sweet 24.05.2011 19:27

Цитата:

Сообщение от FINoM
Это был не вопрос

Точно:)

dmitriymar 24.05.2011 21:41

подобный пример идёт по моему здесь с циклом и таймером
http://www.addconf.ru/event.sdf/ru/a...ySoshnikov/368

FINoM 25.05.2011 01:49

Цитата:

Сообщение от dmitriymar
http://www.addconf.ru/event.sdf/ru/a...ySoshnikov/368

1. То есть смело можно расширять прототипы (если у прототипа задать свойство с enumerable:false)? Просто других причин я не вижу (кроме идеологических).
2. До сих пор не понимаю, зачем использовать геттер следующим образом:
o = {
  a:4,
  b:5,
  get sum() {
    return this.a+this.b;
  }
}

3. Что за хуита?



"Я очень радовался, когда понял что это такое" - немного измененная цитата автора.
Это опечатка и вместо x должен быть k?

FINoM 25.05.2011 01:59

Немного неприятно, что не идет речи о таких фичах, которые были в ES4:
1. Классы
2. Многострочные строки без использования дурацких конкатенаций и не менее идиотского экранирования переносов
"""Я
большая
строка"""

3. Комменты в регулярках
4. Суффиксы (Suffixes on numeric literals denote their type: -7i, 1u, 37d, 14.5m.)
5. "Заполняторы"
[i * i for (i in naturals(10))]

...
Это то что бросилось в глаза (переопределение операторов и прочие спорные моменты не в счет)

poorking 25.05.2011 02:31

FINoM,
Цитата:

Сообщение от FINoM
1. То есть смело можно расширять прототипы (если у прототипа задать свойство с enumerable:false)? Просто других причин я не вижу (кроме идеологических).

Кроме того что свойства прототипа в for in перечисляется есть риск что затрешь чье то расширение или твое затрут. Enumerable решает проблему первого, но второе решено только частично: твое свойство теперь не затрут (если задать только чтение), но надо все равно искать обход того, что имя создаваемого расширения уже может быть занято и у него стоит writable true.

Цитата:

Сообщение от FINoM
2. До сих пор не понимаю, зачем использовать геттер следующим образом:

Получается некое статическое свойство как, например length, мне кажется можно удобно использовать.

3. Скорее всего опечатка

FINoM 25.05.2011 03:51

Цитата:

Сообщение от poorking
Получается некое статическое свойство как, например length, мне кажется можно удобно использовать.

Метод тоже удобно использовать.

poorking 25.05.2011 04:24

FINoM,
Я обратного и не утверждал, но это не одно и тоже, думаю что геттеры и сеттеры очень удобная штука. К примеру какому нибудь свойству, можно задать такой сеттер, что значения присваивать можно будет разных типов данных например, сеттер будет анализировать и приводить к единой системе. И гораздо будет удобнее писать obj.prop = 5, например, чем obj.prop.set(5)

Простой пример: (правда я не проверял ничего, просто наобум, но если так пользоваться можно будет, то это здорово)
var foo = {
	val: 0,
	set dist(d){
		if(typeof d == "number"){
			this.val += d;
		}
		if(typeof d == "string"){
			switch(d.replace(/\d*/, "")){
				case "km":
					this.val += +d.replace("km", "") * 1000 * 100 * 10;
				break;
				/*
				case ...
			
				*/
			}
		
		}
	},
	get dist(){
		return this.val + " millimeters";
	}

}

//а пользоваться очень удобно

foo.dist += "5km";

alert(foo.dist); //5000000 millimeters

Kolyaj 25.05.2011 10:59

Цитата:

Сообщение от FINoM
2. Многострочные строки без использования дурацких конкатенаций и не менее идиотского экранирования переносов

Конкатенация удобней. В многострочных строках проблема с отступами: или отступы не делаем, тогда ломается вложенность кода, или делаем, тогда появляются лишние пробелы в строках.


Цитата:

Сообщение от FINoM
3. Комменты в регулярках

А зачем?

FINoM 25.05.2011 13:04

Цитата:

Сообщение от Kolyaj
В многострочных строках проблема с отступами

Если проблема красивости кода для вас настолько важна, табы можно реплейсить.
Цитата:

Сообщение от Kolyaj
А зачем?

Дык, удобно же:
/# The protocol is an alpha name followed by colon and double slash 
     (?P<protocol> [a-z]+)  
 :     
 /\/\     
     # The host is two or more dot-separated alpha names 
     (?P<host> [a-z]+ (?: \. [a-z]+ )+) 
     # The path is optionally present 
     (?P<path> (?: \/ [a-z]+ )* \/? ) 
    /x

Kolyaj 25.05.2011 13:07

Цитата:

Сообщение от FINoM
Если проблема красивости кода для вас настолько важна, табы можно реплейсить.

Для меня важна проблема читаемости кода. И что такое реплейсить табы? В какой момент?


Регекспы тоже не могут быть многострочными, поэтому и комментариев в них быть не может.

FINoM 25.05.2011 13:08

Цитата:

Сообщение от poorking
obj.prop = 5, например, чем obj.prop.set(5)

Да, но, используя только лишь геттер, скобки совершенно не мешают. Я к тому, что примеры с геттерами sum (в предложенном автором лекции примере) или length не имеют практического смысла.

poorking 25.05.2011 14:22

FINoM,
так это ж просто примеры работы функционала :), практический смысл в реальных задачах

FINoM 25.05.2011 16:41

Цитата:

Сообщение от Kolyaj
Для меня важна проблема читаемости кода. И что такое реплейсить табы? В какой момент?

function valera() {
   let x = """Я
         большая
         строка""".replace('\t'); //не уверен, что правильно, но, надеюсь, смысл понятен

Kolyaj 25.05.2011 16:46

Уродовать код костылями тоже не лучшая идея.
А в чём проблема с конкатенацией?

FINoM 25.05.2011 17:00

Цитата:

Сообщение от Kolyaj
А в чём проблема с конкатенацией?

В отсутствии альтернативы (кроме экранирования).

Kolyaj 25.05.2011 17:04

Если единственная проблема -- отсутствие альтернативы, то зачем альтернатива, если проблем нет?

monolithed 25.05.2011 17:06

Цитата:

Сообщение от Kolyaj
Регекспы тоже не могут быть многострочными, поэтому и комментариев в них быть не может.

var expr = new RegExp('\\d|'+ //цифры
                      '\\w|'+ //символы
                      '\\s', 'g' //пробелы
                     );

alert('h e 1 1 0 w'.match(expr));

FINoM 25.05.2011 17:08

Цитата:

Сообщение от Kolyaj
зачем альтернатива, если проблем нет?

Затем что иногда это удобно.

x-yuri 25.05.2011 21:20

кстати, дополнительные параметры setTimeout задокументированы и в частности описан дополнительный параметр, который ff передает в функцию (как-то создал мне проблемы)

Цитата:

Сообщение от FINoM
1. То есть смело можно расширять прототипы (если у прототипа задать свойство с enumerable:false)? Просто других причин я не вижу (кроме идеологических).

а как это, идеологические причины?

Цитата:

Сообщение от FINoM
Затем что иногда это удобно.

ога, давайте запихнем в язык все, что иногда удобно. А с тем, что действительно нужно, как-нибудь подождем. Если так не хватает всех этих возможностей, надо уходить назад, в python ;)

monolithed 25.05.2011 22:16

Цитата:

Сообщение от x-yuri
Если так не хватает всех этих возможностей, надо уходить назад, в python

почему назад то :) ?

FINoM 26.05.2011 01:18

Цитата:

Сообщение от x-yuri
а как это, идеологические причины?

— Это плохо!
— Почему?
— Так делают только мудаки
Цитата:

Сообщение от x-yuri
давайте запихнем в язык все, что иногда удобн

Не нужно превращать эту тему в абсурд. Многострочность в строках никому не навредит, не хочешь, не используй. На старые приложения оно не повлияет, так как не вносит ничего существенного в язык. Как пример, можно привести операторы +=, /= ..., которые просто делают немножко удобнее.

x-yuri 26.05.2011 02:55

Цитата:

Сообщение от monolithed
почему назад то ?

я не имел в виду, что python - это шаг назад. Я имел в виду, что если при переходе на js сильно не хватает каких-то возможностей другого ЯП, на котором раньше писал, надо продолжать писать на том, другом языке. Или начинать

Цитата:

Сообщение от FINoM
— Это плохо!
— Почему?
— Так делают только мудаки

в общем, под идеологическими причинами ты имел в виду их отсутствие

Цитата:

Сообщение от FINoM
Не нужно превращать эту тему в абсурд. Многострочность в строках никому не навредит, не хочешь, не используй. На старые приложения оно не повлияет, так как не вносит ничего существенного в язык. Как пример, можно привести операторы +=, /= ..., которые просто делают немножко удобнее.

почему абсурд? Если эти изменения делают язык немножко удобнее - тогда какая разница?

FINoM 26.05.2011 04:35

Цитата:

Сообщение от x-yuri
в общем, под идеологическими причинами ты имел в виду их отсутствие

Многие любят родину, но объяснить почему, не могут :)
Цитата:

Сообщение от x-yuri
Если эти изменения делают язык немножко удобнее - тогда какая разница?

Мы друг друга плохо понимаем. Я говорю о том, что многострочность добавит удобства, а в пример привел бессмысленные, по большому счету, операторы в качестве аналогии.

x-yuri 26.05.2011 20:47

Цитата:

Сообщение от FINoM
Многие любят родину, но объяснить почему, не могут

я надеюсь, что мне когда-нибудь все же объяснят :)

Цитата:

Сообщение от FINoM
Мы друг друга плохо понимаем. Я говорю о том, что многострочность добавит удобства, а в пример привел бессмысленные, по большому счету, операторы в качестве аналогии.

хорошо, для тебя это важные изменения. Просто не удивляйся, что их не реализуют. Как видишь, у разработчиков свой взгляд на этот вопрос ;)

monolithed 27.05.2011 08:51

Цитата:

Сообщение от x-yuri
хорошо, для тебя это важные изменения. Просто не удивляйся, что их не реализуют. Как видишь, у разработчиков свой взгляд на этот вопрос

вот только не всегда у них трезвый взгляд (тут спека)
нет чтобы использовать int[] заместо этого чуда Int32Array() (и ему подобных)

FINoM 28.05.2011 01:48

Может кто-то объяснить, почему убрали классы и статическую типизацию (кроме массивов)?

x-yuri 28.05.2011 04:38

лично мне сложно судить о чьих-то решениях, не зная, на чем они основаны. Вот вы как думаете, в чем причина такого "нетрезвого" взгляда и какой взгляд трезвый?

x-yuri 28.05.2011 08:12

Цитата:

Сообщение от monolithed
вот только не всегда у них трезвый взгляд (тут спека)
нет чтобы использовать int заместо этого чуда методаInt32Array() (и ему подобных)

но это ведь требует статической типизации? Это же не ECMA такое придумал. Не могли же они добавить в язык статическую типизацию? Не дождались :)

Цитата:

Сообщение от FINoM
Может кто-то объяснить, почему убрали классы и статическую типизацию (кроме массивов)?

никому это не нужно Наверное, ответы нужно искать где-то здесь, здесь или здесь А для чего тебе нужны классы и статическая типизация, м?

monolithed, ты как-то говорил про добавление статической типизации в динамический язык, можешь напомнить что? :)

monolithed 28.05.2011 09:06

Цитата:

Сообщение от x-yuri
но это ведь требует статической типизации? Это же не ECMA такое придумал. Не могли же они добавить в язык статическую типизацию?

добавить все возможно, AS тоже на ES построен
Цитата:

Сообщение от x-yuri
ты как-то говорил про добавление статической типизации в динамический язык, можешь напомнить что?

то что ошибок/непредсказуемых ситуаций для новичков меньше будет и скорость выполнения программы теоретически увеличится? так вроде только это))
Цитата:

Сообщение от x-yuri
А для чего тебе нужны классы и статическая типизация, м?

так драфт с типизацией массивов уже в FireFox и Chrome имплементирован.

var array = new Uint8Array(3), i = 3;

while(i--) {
    array[i] = i;
}

console.log(array); //Uint8Array { 0=0, 1=1, 2=2}


ниче, скоро стрелочки еще имплементируют

вот как это должно выглядеть (мне кстати безумно нравится, не думал, что БЕ сам такое предложит; Haskel, Ruby напоминает)


Часовой пояс GMT +3, время: 09:23.