| description('Tests for ES6 arrow function lexical bind of this'); |
| |
| function Dog(name) { |
| this.name = name; |
| this.getName = () => eval("this.name"); |
| this.getNameHard = () => eval("(() => this.name)()"); |
| this.getNameNesting = () => () => () => this.name; |
| } |
| |
| var d = new Dog("Max"); |
| shouldBe('d.getName()', 'd.name'); |
| shouldBe('d.getNameHard()', 'd.name'); |
| shouldBe('d.getNameNesting()()()', 'd.name'); |
| |
| var obj = { |
| name : 'objCode', |
| method : function () { |
| return (value) => this.name + "-name-" + value; |
| } |
| }; |
| |
| shouldBe("obj.method()('correct')", "'objCode-name-correct'"); |
| obj.name='newObjCode'; |
| shouldBe("obj.method()('correct')", "'newObjCode-name-correct'"); |
| |
| var deepObj = { |
| name : 'wrongObjCode', |
| internalObject: { |
| name :'internalObject', |
| method: function () { return (value) => this.name + "-name-" + value; } |
| } |
| }; |
| shouldBe("deepObj.internalObject.method()('correct')", "'internalObject-name-correct'"); |
| |
| deepObj.internalObject.name = 'newInternalObject'; |
| |
| shouldBe("deepObj.internalObject.method()('correct')", "'newInternalObject-name-correct'"); |
| |
| var functionConstructor = function () { |
| this.func = () => this; |
| }; |
| |
| var instance = new functionConstructor(); |
| |
| shouldBe("instance.func() === instance", "true"); |
| |
| var ownerObj = { |
| method : function () { |
| return () => this; |
| } |
| }; |
| |
| shouldBe("ownerObj.method()() === ownerObj", "true"); |
| |
| var fake = { steal : ownerObj.method() }; |
| shouldBe("fake.steal() === ownerObj", "true"); |
| |
| var real = { borrow : ownerObj.method }; |
| shouldBe("real.borrow()() === real", "true"); |
| |
| var arrowFunction = { x : "right", getArrowFunction : function() { return z => this.x + z; }}.getArrowFunction(); |
| var hostObj = { x : "wrong", func : arrowFunction }; |
| |
| shouldBe("arrowFunction('-this')", '"right-this"'); |
| shouldBe("hostObj.func('-this')", '"right-this"'); |
| |
| var functionConstructorWithEval = function () { |
| this._id = 'old-value'; |
| this.func = () => { |
| var f; |
| eval('10==10'); |
| this._id = 'new-value'; |
| return this._id; |
| }; |
| }; |
| |
| var arrowWithEval = new functionConstructorWithEval(); |
| |
| shouldBe("arrowWithEval.func()", '"new-value"'); |
| |
| var internal_value_1 = 123; |
| var internal_value_2 = '1234'; |
| |
| function foo() { |
| let arr = () => { |
| var x = internal_value_1; |
| function bas() { |
| return x; |
| }; |
| this._id = internal_value_2; |
| return bas(); |
| }; |
| this.arr = arr; |
| }; |
| |
| var fooObject = new foo(); |
| |
| shouldBe("fooObject.arr()", 'internal_value_1'); |
| shouldBe("fooObject._id", 'internal_value_2'); |
| |
| function boo() { |
| let arr = () => { |
| with ({'this': 40}) { |
| return this; |
| } |
| } |
| return arr(); |
| } |
| |
| let expected = {'this': 20}; |
| |
| shouldBe('boo.call(expected)', 'expected'); |
| shouldBe('(function () { return (a = this)=>{return a;}; }).call(expected)()', 'expected'); |
| |
| var successfullyParsed = true; |