Page 104 - 你不知道的JavaScript(上卷)
P. 104

我们来看看这个变种到底是怎样工作的。我们创建了函数 bar(),并在它的内部手动调用
                 了 foo.call(obj),因此强制把 foo 的 this 绑定到了 obj。无论之后如何调用函数 bar,它
                 总会手动在 obj 上调用 foo。这种绑定是一种显式的强制绑定,因此我们称之为硬绑定。

                 硬绑定的典型应用场景就是创建一个包裹函数,传入所有的参数并返回接收到的所有值:

                     function foo(something) {
                         console.log( this.a, something );
                         return this.a + something;
                     }

                     var obj = {
                         a:2
                     };

                     var bar = function() {
                         return foo.apply( obj, arguments );
                     };

                     var b = bar( 3 ); // 2 3
                     console.log( b ); // 5

                 另一种使用方法是创建一个 i 可以重复使用的辅助函数:

                     function foo(something) {
                         console.log( this.a, something );
                         return this.a + something;
                     }

                     // 简单的辅助绑定函数
                     function bind(fn, obj) {
                         return function() {
                             return fn.apply( obj, arguments );
                         };
                     }

                     var obj = {
                         a:2
                     };

                     var bar = bind( foo, obj );

                     var b = bar( 3 ); // 2 3
                     console.log( b ); // 5
                 由于硬绑定是一种非常常用的模式,所以在 ES5 中提供了内置的方法 Function.prototype.
                 bind,它的用法如下:

                     function foo(something) {
                         console.log( this.a, something );
                         return this.a + something;
                     }

                                                                           this全面解析   |   89
   99   100   101   102   103   104   105   106   107   108   109