如何创建 IIFE Javascript 模块的多个实例?
How to create multiple instances of IIFE Javascript module?
我正在处理一个巨大的 javascript 代码库,我正试图对其进行重组。我不是真正的专家,我只是开始研究好的 javascript 编码实践。所以,我想做的一件事是将所有代码划分为模块。在这种特殊情况下,我试图创建一个模块来帮助我优化视频嵌入。我想向模块传递一个 id 并从中接收一些 html 代码或图像。
我不会把整个代码放在这里,但对于示例来说已经足够了:
var videoIframe = (function($) {
'use strict';
var id,
setVideoId = function(videoId) {
id = videoId;
console.log(id);
},
getVideoThumbnail = function(videoId) {
setVideoId(videoId);
},
test = function() {
console.log(id)
},
getVideoEmbedCode = function() {
};
return {
test: test,
getVideoThumbnail: getVideoThumbnail
};
})(jQuery);
在另一个模块中,我将其分配给两个变量:
var video1 = videoIframe;
var video2 = videoIframe;
video1.getVideoThumbnail(123);
video2.getVideoThumbnail(456);
video1.test();
video2.test();
当然,我没有得到我期望的结果。在第二次 getVideoThumbnail
调用之后,它总是打印 456
.
通过一些研究,我了解到我正在创建一个单例、一个实例,并且我只是在更改该实例内的值。我想我的模块需要一个构造函数,但我不确定如何结合 IIFE 模式来创建它。这是正确的方法吗?
问题是您在分配给 videoIframe
变量时正在初始化对象:
var videoIframe = (function($) {
// ...
})(jQuery);
您可以试试:
var videoIframe = (function($) {
// ...
});
var video1 = videoIframe(jQuery);
var video2 = videoIframe(jQuery);
And is it the right approach?
没有。 IIFE 用于您只想做一次的事情。
如果您想多次执行某项操作,请使用常规函数并多次调用它。
var videoIframe = (function($) {
function videoIframe() {
'use strict';
var id,
setVideoId = function(videoId) {
id = videoId;
console.log(id);
},
getVideoThumbnail = function(videoId) {
setVideoId(videoId);
},
test = function() {
console.log(id)
},
getVideoEmbedCode = function() {
};
return {
test: test,
getVideoThumbnail: getVideoThumbnail
};
}
return videoIframe;
})(jQuery);
var video1 = videoIframe();
var video2 = videoIframe();
video1.getVideoThumbnail(123);
video2.getVideoThumbnail(456);
video1.test();
video2.test();
我做了一些小修改。希望对你有帮助
var videoIframe = (function($) {
'use strict';
var id;
function _setVideoId(videoId) {
id = videoId;
alert(id);
};
function _getVideoThumbnail(videoId) {
_setVideoId(videoId);
};
function _test(){
console.log(id)
}
function _getVideoEmbedCode() {
};
return {
test: _test,
getVideoThumbnail: _getVideoThumbnail
};
})(jQuery);
现在你可以这样调用了
videoIframe.getVideoThumbnail(123);
videoIframe.getVideoThumbnail(561);
只需将 videoIframe 作为 returns 您的 IIFE 的函数,而不是重复使用单例。我保留了 IIFE,因此 id 和内部函数一直被封装,因此,如果它们不在返回的接口对象中,则无法访问。如果您打算创建很多这样的函数,只使用构造函数和原型可能更有效,因此不会为每个实例重新创建内部函数。
var videoIframe = function() {
'use strict';
return (function() {
var id,
setVideoId = function(videoId) {
id = videoId;
console.log(id);
},
getVideoThumbnail = function(videoId) {
setVideoId(videoId);
},
test = function() {
console.log(id)
},
getVideoEmbedCode = function() {
};
return {
test: test,
getVideoThumbnail: getVideoThumbnail
};
}());
};
我正在处理一个巨大的 javascript 代码库,我正试图对其进行重组。我不是真正的专家,我只是开始研究好的 javascript 编码实践。所以,我想做的一件事是将所有代码划分为模块。在这种特殊情况下,我试图创建一个模块来帮助我优化视频嵌入。我想向模块传递一个 id 并从中接收一些 html 代码或图像。
我不会把整个代码放在这里,但对于示例来说已经足够了:
var videoIframe = (function($) {
'use strict';
var id,
setVideoId = function(videoId) {
id = videoId;
console.log(id);
},
getVideoThumbnail = function(videoId) {
setVideoId(videoId);
},
test = function() {
console.log(id)
},
getVideoEmbedCode = function() {
};
return {
test: test,
getVideoThumbnail: getVideoThumbnail
};
})(jQuery);
在另一个模块中,我将其分配给两个变量:
var video1 = videoIframe;
var video2 = videoIframe;
video1.getVideoThumbnail(123);
video2.getVideoThumbnail(456);
video1.test();
video2.test();
当然,我没有得到我期望的结果。在第二次 getVideoThumbnail
调用之后,它总是打印 456
.
通过一些研究,我了解到我正在创建一个单例、一个实例,并且我只是在更改该实例内的值。我想我的模块需要一个构造函数,但我不确定如何结合 IIFE 模式来创建它。这是正确的方法吗?
问题是您在分配给 videoIframe
变量时正在初始化对象:
var videoIframe = (function($) {
// ...
})(jQuery);
您可以试试:
var videoIframe = (function($) {
// ...
});
var video1 = videoIframe(jQuery);
var video2 = videoIframe(jQuery);
And is it the right approach?
没有。 IIFE 用于您只想做一次的事情。
如果您想多次执行某项操作,请使用常规函数并多次调用它。
var videoIframe = (function($) {
function videoIframe() {
'use strict';
var id,
setVideoId = function(videoId) {
id = videoId;
console.log(id);
},
getVideoThumbnail = function(videoId) {
setVideoId(videoId);
},
test = function() {
console.log(id)
},
getVideoEmbedCode = function() {
};
return {
test: test,
getVideoThumbnail: getVideoThumbnail
};
}
return videoIframe;
})(jQuery);
var video1 = videoIframe();
var video2 = videoIframe();
video1.getVideoThumbnail(123);
video2.getVideoThumbnail(456);
video1.test();
video2.test();
我做了一些小修改。希望对你有帮助
var videoIframe = (function($) {
'use strict';
var id;
function _setVideoId(videoId) {
id = videoId;
alert(id);
};
function _getVideoThumbnail(videoId) {
_setVideoId(videoId);
};
function _test(){
console.log(id)
}
function _getVideoEmbedCode() {
};
return {
test: _test,
getVideoThumbnail: _getVideoThumbnail
};
})(jQuery);
现在你可以这样调用了
videoIframe.getVideoThumbnail(123);
videoIframe.getVideoThumbnail(561);
只需将 videoIframe 作为 returns 您的 IIFE 的函数,而不是重复使用单例。我保留了 IIFE,因此 id 和内部函数一直被封装,因此,如果它们不在返回的接口对象中,则无法访问。如果您打算创建很多这样的函数,只使用构造函数和原型可能更有效,因此不会为每个实例重新创建内部函数。
var videoIframe = function() {
'use strict';
return (function() {
var id,
setVideoId = function(videoId) {
id = videoId;
console.log(id);
},
getVideoThumbnail = function(videoId) {
setVideoId(videoId);
},
test = function() {
console.log(id)
},
getVideoEmbedCode = function() {
};
return {
test: test,
getVideoThumbnail: getVideoThumbnail
};
}());
};