116 lines
2.9 KiB
JavaScript
116 lines
2.9 KiB
JavaScript
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;
|