Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Цепочка функций (https://javascript.ru/forum/misc/6967-cepochka-funkcijj.html)

Dmitry A. Soshnikov 11.01.2010 22:04

Цитата:

Сообщение от Volk_88
Что касается данного выражения, думаю это было сделано из учета обращения к глобальному объекту в коде фреймворка, где this - не является глобальным объектом

Да, если процент обращения к window в контекстах, где this не равен глобальному объекту большой, то это является оптимизацией. Но, тогда, идеологически верно было бы var window = window, что я и отметил, поскольку есть разница между window и глобальным объектом.

Цитата:

Сообщение от Volk_88
а вот this уже на jQuery (или я не прав? =) )

Прав, но вообще, зависит от выражения вызова и this определяется каждый раз при вызове, поэтому и этот метод extend можно вызвать так, где this будет не jQuery.

Цитата:

Сообщение от Volk_88
но вот я так и не понял, для чего реализована функция noConflict

Чтобы иметь возможность восстановить затёртые идентификаторы $ и jQuery (теоретически и практически, пользователь может использовать несколько фреймворков; noConflict позволит использовать $, например, из Prototype.js, а имя jQuery - из jQuery; также, там предусмотрен глубокий вариант восстановления, где восстанавливается и имя jQuery).

Цитата:

Сообщение от Volk_88
а на сколько бы изменение в первом примере window на this дало бы выигрыш

Здесь надо почитать про разрешение имён идентификаторов и цепь областей видимости.

Любой идентификатор разрешается - определяется, к какой области видимости в иерархической цепи, он относится. Это делается каждый раз при обращении к имени переменной. Соответственно, чем глубже контекст исполнения, тем дольше будет разрешаться идентификатор, определённый в более высоких контекстах исполнения (например, глобальном контексте).

(function () {
  (function () {
    (function () {
      alert([this, window]);
    })();
  })();
})();


Здесь, чтобы разрешить имя window нужно просмотреть scope chain (цепь областей видимости) из самого глубокого контекста исполнения - и вверх по цепи, т.е. 4 звена цепи.

В свою очередь, this, как уже было отмечено, никогда не разрешается, он определён один раз при входе в контекст. Поэтому в alert-e из примера выше значение this будет получено сразу - в отличие от window.

Однако, поскольку window - это host-объект, его разрешение (и вообще поведение) может зависеть от реализации.

Подробней про scope chain: http://javascript.ru/blog/Dmitry-A.-...j-vidimosti.-0

zeran 17.03.2011 13:51

Цитата:

Сообщение от Octane (Сообщение 39978)
что-то куча связей fn-init-prototype и ненужных оберток
function $(…) {
    return new $.wrapper(…);
}

$.wrapper = function (…) {
    this… = …;
};

$.wrapper.prototype = $.prototype = {
    constructor: $,
    raz: …,
    dva: …,
    tri: …
};

Проблем вроде нет, если удобно, ни что не мешает использовать.

-
А можно привести полный пример кода, а то не получается сделать рабочий пример :(( Говорит: $ is not defined

monolithed 18.03.2011 21:33

Цитата:

Сообщение от zeran
А можно привести полный пример кода, а то не получается сделать рабочий пример

<div id="div">text</div>

<script type="text/javascript">
function $(id) {
    if(this.$) return new $.wrapper(id);
}

$.wrapper = function(id) {
     if(typeof id == 'string' /* etc ... */) {
         this.id = document.getElementById(id);
     }
};

$.wrapper.prototype = $.prototype = {
    constructor: $,
    css: function(value) {
        for(i in value) {
            this.id.style[i] = value[i];
        }
         return this;
    }
    /* , 
    ....
   */
};

$('div').css({'color':'red', 'textTransform':'uppercase'});

</script>


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