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
“私有”的原因?(但在这里它并没有带来任何好处)。@SugatoSenguptavar counter=(()=>{let cnt=0;return()=>++cnt;})()代码>以下是示例。它是一个计数器函数,具有局部作用域的计数器值,即使需要也不能处理。@SugatoSengupta,这是ecmascript 6。如果您了解ecmascript 5,就不难理解了。只需查找引用您需要将iLife返回的内容分配给MyModule
变量,如果您想全局访问函数,为什么要在iLife中定义它?这就是他们设计用来阻止lol..@sugatosengpta使函数log
“私有”的原因?(但在这里它并没有带来任何好处)。@SugatoSenguptavar 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语句,所以我不确定哪一个更好它不是全局的更安全,但它取决于环境。如果环境支持,这些库可以作为模块工作,但是在浏览器的情况下,它们