Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.01.2015, 14:33
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

передача this.
var obj = {
	value:1,
	fn: function() {

		(function(){
			this.value = 223;
		}).call(this);
	}
}

obj.fn();
console.log(obj.value)
var start = +new Date();

for(var i = 0; i < 2000000; i++) {
	obj.fn();
	if(i == 1999999) console.log(+new Date() -start)
}


call(this) быстрее чем передача this через переменную, в crhome на 100 мс.
apply медленнее на 200 за call.
bind медленнее всех больше чем 100 раз.

задаюсь вопросом почему в скриптах часто встречаю передачу через переменную that .


может я плохо проводил тесты , кому интересно попробуйте у себя и напишите как у вас
Ответить с цитированием
  #2 (permalink)  
Старый 24.01.2015, 15:23
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
задаюсь вопросом почему в скриптах часто встречаю передачу через переменную that .
Как ты собираешься использовать call в ситуации с коллбеками?
Ответить с цитированием
  #3 (permalink)  
Старый 24.01.2015, 15:25
Аспирант
Посмотреть профиль Найти все сообщения от dobryk
 
Регистрация: 23.09.2014
Сообщений: 48

Сообщение от caetus
fn: function() {
04
 
05
        (function(){
06
            this.value = 223;
07
        }).call(this);
08
    }
Сообщение от caetus
for(var i = 0; i < 2000000; i++) {
    obj.fn();
    if(i == 1999999) console.log(+new Date() -start)
}
в топку такие тесты, ты не передачу
Сообщение от caetus
call(this) быстрее чем передача this через переменную, в crhome на 100 мс.
apply медленнее на 200 за call.
bind медленнее всех больше чем 100 раз.
сравниваешь, а сравниваешь оптимизации хрома, поскольку при каждом вызове ты создаешь функцию какая оптимизируется движком хрома, либо не оптимизируется в зависимости от применяемого метода http://habrahabr.ru/post/154537/
Ответить с цитированием
  #4 (permalink)  
Старый 24.01.2015, 15:41
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
а сравниваешь оптимизации хрома
В FF все точно так же.
Ответить с цитированием
  #5 (permalink)  
Старый 24.01.2015, 15:47
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

var obj = {
	val: 1,
	fn: function (callback) {
		return callback.call(this);
	}
}

например так
Ответить с цитированием
  #6 (permalink)  
Старый 24.01.2015, 15:51
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

в ie8 call медленнее на 100мс ,при затрате на вызов функции 2 ляма раз.
Ответить с цитированием
  #7 (permalink)  
Старый 24.01.2015, 15:52
Аспирант
Посмотреть профиль Найти все сообщения от dobryk
 
Регистрация: 23.09.2014
Сообщений: 48

Сообщение от Erolast
В FF все точно так же.
написал же что сравнивает не передачу this а время создания и выполнения анонимной функции
различными методами, какие занимают разное время априори

Сообщение от dobryk
а сравниваешь оптимизации хрома, поскольку при каждом вызове ты создаешь функцию какая оптимизируется движком хрома, либо не оптимизируется в зависимости от применяемого метода
что тебе не ясно то из написанного?

а чтоб сравнивать передачу this:
Сообщение от caetus
16
    obj.fn();
здесь нужно использовать call, apply или забинженую функцию

Последний раз редактировалось dobryk, 24.01.2015 в 15:56.
Ответить с цитированием
  #8 (permalink)  
Старый 24.01.2015, 15:53
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
var obj = {
val: 1,
fn: function (callback) {
return callback.call(this);
}
}

например так
Что? Это аналогично простому вызову без call:
var obj = {
    val: 1,
    fn: function (callback) {
        return callback();
    }
}


Я имел в виду такое:
var storage = {
  getData: function() {
    var that = this;
    $.get("data.php", function(response) {
      that.data = response;
    }
  }
}
Ответить с цитированием
  #9 (permalink)  
Старый 24.01.2015, 16:08
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

да тут никак не передать , я тебе говорю про код с замыканиям , часто передают this через переменную , как на меня передача через call более
читаемо !
Ответить с цитированием
  #10 (permalink)  
Старый 24.01.2015, 16:16
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Более читаемо - это использовать ES6.
var obj = {
  method() {
    (() => {
      var x = 10;
      console.log(this == obj); //true
    })();
    console.log(typeof x); //undefined
  }
}

Или даже так:
var obj = {
  method() {
    {
      let x = 10;
      console.log(this == obj); //true
    }
    console.log(typeof x); //undefined
  }
}

Последний раз редактировалось Erolast, 24.01.2015 в 16:20.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача значений из ячеек таблицы в поля ayubu87 AJAX и COMET 1 26.05.2014 08:21
Передача переменной в функцию jankovsky Общие вопросы Javascript 4 26.08.2013 18:58
Передача данных с поддомена на основной домен platedz AJAX и COMET 4 08.03.2013 23:15
передача объекта через параметр функции PHP zhurchik Серверные языки и технологии 1 06.12.2012 15:24
передача функции с параметрами в функцию oli Общие вопросы Javascript 3 09.08.2012 13:52