ES5 шим для связывания функций является Javascript - PullRequest
1 голос
/ 12 марта 2012

Ниже приведена прокладка ES5 для привязки JS. Я не понимаю self .применить в связанной функции. Я знаю, как использовать метод apply, но куда в этом случае указывает self ? Это должно быть
функция, но здесь self выглядит как объект.

if ( !Function.prototype.bind ) {

       Function.prototype.bind = function( obj ) {

        var slice = [].slice,
        args = slice.call(arguments, 1),
        self = this,

        nop = function () {},

        bound = function () {
        return self.apply( this instanceof nop ? this : ( obj || {} ), // self in this line is supposed  
        to // represent a function ?
        args.concat( slice.call(arguments) ) );
        };

        nop.prototype = self.prototype;
        bound.prototype = new nop();
        return bound;
        };
  }

Ответы [ 2 ]

2 голосов
/ 01 января 2014

self используется в указанной вами прокладке, чтобы учесть тот факт, что this изменяется вместе с изменением объема.В прямой области действия Function.prototype.bind функция this будет ссылаться на объект, для которого была вызвана функция привязки.

После ввода области действия вложенной bound функция this имеетизменено;поэтому автор назначил self = this в функции bind, чтобы значение this в то время, когда вызывается bind, остается доступным для функции bound через лексическое определение (замыкание).

Область видимости в JavaScript может быть довольно сложной;для подробного объяснения взгляните на эту статью.

Все, что вы хотели знать о области видимости JavaScript.

0 голосов
/ 18 мая 2012

Имейте в виду, что в javascript почти все является объектом.

Итак, у вас есть это прямо здесь:

self = this

Итак, self не представляет что-либо, self является экземпляром.

...