Javascript iife返回的函数工作不正常

Javascript iife返回的函数工作不正常,javascript,iife,Javascript,Iife,我正在尝试创建一个模块,并尝试使用正确的设计。我看到了,他们的生活返回了函数,这是一个模块。我试着这样做: (函数(){ 函数MyModule(){ var something='something'; this.log=log(); } MyModule.prototype.alert=函数(){ 警惕(这件事); }; 函数日志(){ log('hello'); } 返回MyModule; })(); var module1=新的MyModule()MyModule位于iLife clou

我正在尝试创建一个模块,并尝试使用正确的设计。我看到了,他们的生活返回了
函数
,这是一个模块。我试着这样做:

(函数(){
函数MyModule(){
var something='something';
this.log=log();
}
MyModule.prototype.alert=函数(){
警惕(这件事);
};
函数日志(){
log('hello');
}
返回MyModule;
})();

var module1=新的MyModule()
MyModule
位于iLife clousure内部,因此从外部代码看不到它。将IIFE的结果分配给
MyModule
变量

另外,您可能想将
log
函数分配给正在构造的
MyModule
,而不是其结果(
undefined

最后,在构造函数中声明名为
something
的变量并没有将其指定为正在构造的对象的属性。如果希望
某物
是私有的,则必须在构造函数的clousure中声明
警报
方法:

var MyModule = (function() {
  function MyModule() {
    var something = 'something';
    this.log = log;
    // this.log = log();

    this.alert = function() {
        alert(something);
    };
  }

  //MyModule.prototype.alert = function() {
  //    alert(this.something);
  //};

  function log() {
    console.log('hello');
  }

  return MyModule;
})();

var module1 = new MyModule();

module1.alert(); // Alerts 'something'
module1.log(); // Logs 'hello'
要真正理解JavaScript,请忘记类,了解一般的原型和函数,特别是clousures


请注意这一点。MyModule位于iLife clousure内部,因此从外部代码看不到它。将IIFE的结果分配给
MyModule
变量

另外,您可能想将
log
函数分配给正在构造的
MyModule
,而不是其结果(
undefined

最后,在构造函数中声明名为
something
的变量并没有将其指定为正在构造的对象的属性。如果希望
某物
是私有的,则必须在构造函数的clousure中声明
警报
方法:

var MyModule = (function() {
  function MyModule() {
    var something = 'something';
    this.log = log;
    // this.log = log();

    this.alert = function() {
        alert(something);
    };
  }

  //MyModule.prototype.alert = function() {
  //    alert(this.something);
  //};

  function log() {
    console.log('hello');
  }

  return MyModule;
})();

var module1 = new MyModule();

module1.alert(); // Alerts 'something'
module1.log(); // Logs 'hello'
要真正理解JavaScript,请忘记类,了解一般的原型和函数,特别是clousures


请仔细观看,以确保操作正确。

我不确定您想用这个模块做什么,但这取决于它的外观。这将始终记录hello,并设置一个提醒“某物”的提醒功能

var MyModule = (function() {
    var something = 'something';

  this.prototype.alert = function() {
    alert(this.something);
  };

    console.log('hello');
})();

var module1 = new MyModule();
但是,如果您想将其设置为将不同的内容传递给警报和日志,您应该能够这样做

var MyModule = (function( txt ) {
    var something = this.txt;

  this.prototype.alert = function() {
    alert(something);
  };

    console.log('hello '+ something);
})();

var module1 = new MyModule();
   module1('this is awesome text');

我不太确定你想用这个模块做什么,但基于它的外观。这将始终记录hello,并设置一个提醒“某物”的提醒功能

var MyModule = (function() {
    var something = 'something';

  this.prototype.alert = function() {
    alert(this.something);
  };

    console.log('hello');
})();

var module1 = new MyModule();
但是,如果您想将其设置为将不同的内容传递给警报和日志,您应该能够这样做

var MyModule = (function( txt ) {
    var something = this.txt;

  this.prototype.alert = function() {
    alert(something);
  };

    console.log('hello '+ something);
})();

var module1 = new MyModule();
   module1('this is awesome text');


您需要将iLife返回的内容分配给
MyModule
变量,如果您希望全局访问函数,为什么要在iLife中定义它?这就是他们设计用来阻止lol..@sugatosengpta使函数
log
“私有”的原因?(但在这里它并没有带来任何好处)。@SugatoSengupta
var counter=(()=>{let cnt=0;return()=>++cnt;})()以下是示例。它是一个计数器函数,具有局部作用域的计数器值,即使需要也不能处理。@SugatoSengupta,这是ecmascript 6。如果您了解ecmascript 5,就不难理解了。只需查找引用您需要将iLife返回的内容分配给
MyModule
变量,如果您想全局访问函数,为什么要在iLife中定义它?这就是他们设计用来阻止lol..@sugatosengpta使函数
log
“私有”的原因?(但在这里它并没有带来任何好处)。@SugatoSengupta
var counter=(()=>{let cnt=0;return()=>++cnt;})()以下是示例。它是一个计数器函数,具有局部作用域的计数器值,即使需要也不能处理。@SugatoSengupta,这是ecmascript 6。如果您了解ecmascript 5,就不难理解了。查一下参考资料谢谢!我认为这可能是问题所在,但当我检查问题中发布的库时,他们没有执行
var MyModule=(function(){
,他们只是执行
返回
,而没有赋值。在该库中,他们通过将变量赋值给window对象将变量赋值为全局变量:
window[“Sortable”]=factory()
,检查第22行。这与
Sortable=…
相同。哦,我实际上不知道3个if语句在做什么。我打算在我完成项目时检查它在做什么。使用
Sortable=…
还是将变量设置为全局变量更好?不将其设置为全局变量不是更安全吗?但我明白,大多数库都是这样有3个if语句,所以我不确定哪一个更好。不使其全局化更安全,但这取决于环境。如果环境支持,这些库准备作为模块工作,但在浏览器的情况下,它们必须依赖全局变量。谢谢!我想这可能是问题所在,但当我检查libr时在问题中,他们没有执行
var MyModule=(function(){
,他们只是执行
返回
,没有赋值。在该库中,他们通过将变量赋值给window对象将变量赋值为全局变量:
window[“Sortable”]=factory()
,检查第22行。这与
Sortable=…
相同。哦,我实际上不知道3个if语句在做什么。我打算在我完成项目时检查它在做什么。使用
Sortable=…
还是将变量设置为全局变量更好?不将其设置为全局变量不是更安全吗?但我明白,大多数库都是这样有3个if语句,所以我不确定哪一个更好它不是全局的更安全,但它取决于环境。如果环境支持,这些库可以作为模块工作,但是在浏览器的情况下,它们