如果我将脚本包装在匿名样式函数中,就像在Coffeescript中编译适合操作DOM一样?
(function() {
this.detect = function(){
window.alert( "message" );
};
}).call(this);
答案 0 :(得分:3)
完全合适。这通常被称为IIFE。
好处是:
您可以通过“在命名空间下工作”来避免变量命名冲突 - 命名变量和设置范围:
(function ($, DOM, ultraSelector) {
$(DOM).find(ultraSelector); // $ is always jQuery
})(jQuery, document, 'mySelector');
$ = false; // here $ is not jQuery anymore
您的变量在您的范围内保持管理,绝不可全球访问;以及
您可以'use strict'
安全地知道只有IIFE内的代码会受到影响:
(function () {
'use strict';
globalVariable = true; // will throw error
var scopedVariable = true; // only accessible inside this IIFE
})();
globalVariable = true; // will define a global variable
var scopedVariable = true; // is not really scoped, since its scope is global
我会说它更安全,是的。至少你的变量不能通过浏览器控制台轻松访问。
我强烈建议使用IIFE,Douglas Crockford - http://javascript.crockford.com/
......他主张parens应该在声明(function(){ }())
答案 1 :(得分:0)
它既不安全也不安全。
与命名函数相比,匿名函数的缺点是它只被调用一次(或每个父函数一次),因为该代码块被读取。它不能通过名称来调用。
与命名函数相比,匿名函数的优点是语法更短。
但是如果问题是是否使用这个匿名函数作为包装器,我真的没有看到任何优势。它只是添加额外的代码。
编辑:如果您的匿名函数稍长,并且包含变量,我可以看到避免使用这些变量名称污染全局范围是有用的。但在你的例子中,情况并非如此。请参阅此答案,以了解它对命名空间有用的方法:https://stackoverflow.com/a/2421949/4992551。