IIFE中对象和返回对象之间的区别

use*_*999 3 javascript

this在对象的函数内使用关键字可以正常工作,但是在没有的情况下引用其他函数this.当我在对象之前放出这些函数时,两种方式都有效.为什么会这样?

var Obj = {
  func1: function () {
    console.log(this.func2()); // works
    console.log(func2()); // doesn't work
  },
  func2: function () {
    return 5;
  }
};
Obj.func1();
Run Code Online (Sandbox Code Playgroud)

但在IIFE中做同样的事情:

var Obj = (function () {
  function func1() {
    console.log(this.func2()); // works
    console.log(func2()); // works
  }
  function func2() {
    return 5;
  }
  return {
    func1: func1,
    func2: func2
  };
})();
Obj.func1();
Run Code Online (Sandbox Code Playgroud)

ade*_*neo 5

这与IIFE无关,在第一个例子中,你有一个对象文字,在第二个常规函数中.

当然,对象文字需要对象的名称(或者this如果this-value 对象,就像在对象文字内),后跟属性来访问它,而命名函数只需要使用就可以在该范围内的任何地方访问名字.

var obj = {
    prop : function() {...}
}

prop(); // fail ... undefined
obj.prop(); // works

// then _______________________________________________________________

function prop() {...}

prop(); // works fine 
Run Code Online (Sandbox Code Playgroud)

这正是你正在做的事情,你只是将它包装在不同的对象中并立即调用函数表达式,所以它看起来有点相同,但事实并非如此.