1)

  1. var x = 3,
  2. obj = {
  3. x: 5
  4. };
  5. obj.fn = (function () {
  6. this.x *= ++x;
  7. return function (y) {
  8. this.x *= (++x) + y;
  9. console.log(x);
  10. }
  11. })();
  12. var fn = obj.fn;
  13. obj.fn(6);
  14. fn(4);
  15. console.log(obj.x, x, window.x);

1.png

2)

  1. let obj = {
  2. fn: (function () {
  3. return function () {
  4. console.log(this);
  5. }
  6. })()
  7. };
  8. // obj.fn=fn=function() { console.log(this); }
  9. obj.fn(); //this->obj
  10. let fn = obj.fn;
  11. fn(); //this->window/undefined

3)

  1. var fullName = 'language'; //window.fullName='language';
  2. var obj = {
  3. fullName: 'javascript',
  4. prop: {
  5. getFullName: function () {
  6. return this.fullName;
  7. }
  8. }
  9. };
  10. console.log(obj.prop.getFullName());
  11. // this->obj.prop obj.prop.fullName=>undefined
  12. var test = obj.prop.getFullName;
  13. console.log(test());
  14. // this->window window.fullName=>'language'

4)

  1. var name = 'window';
  2. var Tom = {
  3. name: "Tom",
  4. show: function () {
  5. // this->window
  6. console.log(this.name);
  7. },
  8. wait: function () {
  9. // this->Tom
  10. var fun = this.show;
  11. fun();
  12. }
  13. };
  14. 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);

1-2.png