function bound() {

            if (this instanceof bound) {
                // 15.3.4.5.2 [[Construct]]
                // When the [[Construct]] internal method of a function object,
                // F that was created using the bind function is called with a
                // list of arguments ExtraArgs the following steps are taken:
                // 1. Let target be the value of F's [[TargetFunction]]
                //   internal property.
                // 2. If target has no [[Construct]] internal method, a
                //   TypeError exception is thrown.
                // 3. Let boundArgs be the value of F's [[BoundArgs]] internal
                //   property.
                // 4. Let args be a new list containing the same values as the
                //   list boundArgs in the same order followed by the same
                //   values as the list ExtraArgs in the same order.

                var self = Object.create(target.prototype);
                target.apply(self, args.concat(slice.call(arguments)));
                return self;

            } else {
                // 15.3.4.5.1 [[Call]]
                // When the [[Call]] internal method of a function object, F,
                // which was created using the bind function is called with a
                // this value and a list of arguments ExtraArgs the following
                // steps are taken:
                // 1. Let boundArgs be the value of F's [[BoundArgs]] internal
                //   property.
                // 2. Let boundThis be the value of F's [[BoundThis]] internal
                //   property.
                // 3. Let target be the value of F's [[TargetFunction]] internal
                //   property.
                // 4. Let args be a new list containing the same values as the list
                //   boundArgs in the same order followed by the same values as
                //   the list ExtraArgs in the same order. 5.  Return the
                //   result of calling the [[Call]] internal method of target
                //   providing boundThis as the this value and providing args
                //   as the arguments.

                // equiv: target.call(this, ...boundArgs, ...args)
                return target.call.apply(
                    target,
                    args.concat(slice.call(arguments))
                );

            }

        }
function bound() {

            if (this instanceof bound) {
                
                
                
                
                
                
                
                
                
                
                
                
                

                var self = Object.create(target.prototype);
                target.apply(self, args.concat(slice.call(arguments)));
                return self;

            } else {
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                

                
                return target.call.apply(
                    target,
                    args.concat(slice.call(arguments))
                );

            }

        }
function bound ( ) { if ( this instanceof bound ) { // 15.3.4.5.2 [[Construct]] // When the [[Construct]] internal method of a function object, // F that was created using the bind function is called with a // list of arguments ExtraArgs the following steps are taken: // 1. Let target be the value of F's [[TargetFunction]] //   internal property. // 2. If target has no [[Construct]] internal method, a //   TypeError exception is thrown. // 3. Let boundArgs be the value of F's [[BoundArgs]] internal //   property. // 4. Let args be a new list containing the same values as the //   list boundArgs in the same order followed by the same //   values as the list ExtraArgs in the same order. var self = Object . create ( target . prototype ) ; target . apply ( self , args . concat ( slice . call ( arguments ) ) ) ; return self ; } else { // 15.3.4.5.1 [[Call]] // When the [[Call]] internal method of a function object, F, // which was created using the bind function is called with a // this value and a list of arguments ExtraArgs the following // steps are taken: // 1. Let boundArgs be the value of F's [[BoundArgs]] internal //   property. // 2. Let boundThis be the value of F's [[BoundThis]] internal //   property. // 3. Let target be the value of F's [[TargetFunction]] internal //   property. // 4. Let args be a new list containing the same values as the list //   boundArgs in the same order followed by the same values as //   the list ExtraArgs in the same order. 5.  Return the //   result of calling the [[Call]] internal method of target //   providing boundThis as the this value and providing args //   as the arguments. // equiv: target.call(this, ...boundArgs, ...args) return target . call . apply ( target , args . concat ( slice . call ( arguments ) ) ) ; } }
4. Let F be a new native ECMAScript object. 9. Set the [[Prototype]] internal property of F to the standard built-in Function prototype object as specified in 15.3.3.1. 10. Set the [[Call]] internal property of F as described in 15.3.4.5.1. 11. Set the [[Construct]] internal property of F as described in 15.3.4.5.2. 12. Set the [[HasInstance]] internal property of F as described in 15.3.4.5.3. 13. The [[Scope]] internal property of F is unused and need not exist.
4 . Let F be a new native ECMAScript object . 9 . Set the [[ Prototype ]] internal property of F to the standard built - in Function prototype object as specified in 15 . 3 . 3 . 1 . 10 . Set the [[ Call ]] internal property of F as described in 15 . 3 . 4 . 5 . 1 . 11 . Set the [[ Construct ]] internal property of F as described in 15 . 3 . 4 . 5 . 2 . 12 . Set the [[ HasInstance ]] internal property of F as described in 15 . 3 . 4 . 5 . 3 . 13 . The [[ Scope ]] internal property of F is unused and need not exist .