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->obj
let 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=>undefined
var 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);