1)
var x = 3, obj = { x: 5 };obj.fn = (function () { this.x *= ++x; return function (y) { this.x *= (++x) + y; console.log(x); }})();var fn = obj.fn;obj.fn(6);fn(4);console.log(obj.x, x, window.x);
2)
let obj = { fn: (function () { return function () { console.log(this); } })()};// obj.fn=fn=function() { console.log(this); }obj.fn(); //this->objlet fn = obj.fn;fn(); //this->window/undefined
3)
var fullName = 'language'; //window.fullName='language';var obj = { fullName: 'javascript', prop: { getFullName: function () { return this.fullName; } }};console.log(obj.prop.getFullName());// this->obj.prop obj.prop.fullName=>undefinedvar test = obj.prop.getFullName;console.log(test());// this->window window.fullName=>'language'
4)
var name = 'window';var Tom = { name: "Tom", show: function () { // this->window console.log(this.name); }, wait: function () { // this->Tom var fun = this.show; fun(); }};Tom.wait(); //'window'
5)
window.val = 1;
var json = {
val: 10,
dbl: function () {
this.val *= 2;
}
}
json.dbl();
// this->json json.val *= 2 => json.val=20
var dbl = json.dbl;
dbl();
//this->window window.val *= 2 => window.val=2
json.dbl.call(window);
//this->window window.val *= 2 => window.val=4
alert(window.val + json.val); //“24”
6)
(function () {
var val = 1; //2
var json = {
val: 10,
dbl: function () {
val *= 2;
}
};
json.dbl();
alert(json.val + val); //“12”
})();
7)
var x = 2;
var y = {
x: 3,
z: (function (x) {
this.x *= x;
x += 2;
return function (n) {
this.x *= n;
x += 3;
console.log(x);
}
})(x)
// y.x 会报错:因为开辟堆内存,存储键值对过程中,把自执行函数执行的,但是此时,键值对还没有存放完成,堆内存的地址还没有和y关联在一起呢 y->undefined
};
var m = y.z;
m(4);
y.z(5);
console.log(x, y.x);
