使用这种模式lint在我设置一个新的公共var(属性?)而不给它一个默认值时会抱怨。这是不好的做法吗?
// file1.js
/*jslint browser: true, white: true, todo: true */
if( typeof(app) === "undefined" ){ //lint complains here about the "undefined"
var app = {};
}
//Self-Executing Anonymous Function (Public & Private)
(function( core, $, undefined ) {
//private var
var privateVarValue;
//public var
app.core.publicVarValue; //lint complains here (expected assignment or function call)
app.core.someFunction = function(){
//do something
});
}( window.app.core = window.app.core || {}, jQuery ));
// file2.js
/*jslint browser: true, white: true, todo: true */
if( typeof(app) === "undefined" ){ //lint complains here about the "undefined"
var app = {};
}
//Self-Executing Anonymous Function (Public & Private)
(function( aModule, $, undefined ) {
app.aModule .someFunction = function(){
if(someCondition){
app.core.publicVarValue = "1";
}
else {
app.core.publicVarValue = "2";
}
});
app.aModule.a = function(){
//do something
console.log(app.core.publicVarValue);
});
app.aModule.b = function(){
if(app.core.publicVarValue){
app.aModule.a();
} else {
//the public still hasnt been set, kick back an error
console.log('an error occurred');
}
});
}( window.app.aModule= window.app.aModule || {}, jQuery ));
Lint不喜欢publicVarValue
为空,这让我有必要设置默认值。有人可以告诉我,我怎么能压制lint和什么最短的现实值,我可以应用于这个公共var来初始化它,它将在以后使用。
编辑,修改问题..
答案 0 :(得分:1)
说实话,这段代码有点混乱(见下面的项目符号),而且我还不确定问题到底是什么。我将假设它"我如何抓住这些代码"。这是一种方式。
请注意my comment,我的意思是将您的代码带到JSLint.com并让它在那里工作,而无需打开任何开关(在您开始执行时将它们打在文件的顶部;那&# 39;好的)。您的代码中仍然存在许多明显的错误,例如每个函数分配上的额外结束错误。
[编辑:删除了之前的代码,替换为以下内容。如果它有用,您可以在编辑历史记录中看到旧内容]
所以这里有一些指示:
window.app.aModule
作为aModule
传递,则没有理由在您的函数中继续使用全局句柄app.aModule
。 (我从那些引用中删除了全局上下文。)编辑:如果你想做匿名封闭技巧,那么1.)不要传递全局和2.)确保你在某个地方有一个私有变种,或者你在浪费这个伎俩!someCondition
之类的变量。undefined
作为参数 - 那里的目标是什么?
... 编辑:好的,我想我得到了你现在想做的事情;感谢博客链接。让我失望的是,你没有利用模式的真正优势,能够限制对闭包内变量和函数的访问,实质上是将它们设为私有而只选择将您选择的API公开给全局范围。"在你的东西中,一切都附在aModule
上;没有"私人"变量
我认为你正在尝试做这样的事情......
/*jslint browser: true, white: true, todo: true, sloppy:true */
/*global jQuery */
// No reason to pass in a globally scoped variable if
// you're always accessing it globally. See Dalgleish's
// line where he says `window.baz = baz;` -- `baz` isn't
// passed.
(function($) {
// Now the way you had this written, it didn't benefit
// from the pattern. Let's use publicVarValue as a
// private variable here, just as an example.
// It's now *only* in this anonymous scope.
var publicVarValue;
// Set up the first function on the global module.
// Note that you never initialized `someCondition`;
// I'm making it a param
window.app.aModule.someFunction = function(someCondition){
if(someCondition){
publicVarValue = "1";
}
else {
publicVarValue = "2";
}
};
// Set up the second function on the global module.
window.app.aModule.a = function(){
//do something
$("#someId").append("Value is: " + publicVarValue + "<br />");
};
// Now we set up the function contingent on publicVarValue
// being set.
window.app.aModule.b = function(){
if (publicVarValue) {
window.app.aModule.a();
} else {
//the public still hasnt been set, kick back an error
window.console.log('an error occurred');
}
};
}(jQuery));
因此,匿名函数作用域模式和JSLints没有问题。
那更有意义吗?没有理由将句柄传递给全局,但仍然不确定为什么你有undefined
的参数,但除此之外,这就是你链接的模式所暗示的。
但我最大的怀疑是,你想要publicVarValue
,嗯,公开。我不确定为什么 - 如果你真的不需要公开它,那么上面是使用Dalgleish描述的模式的代码。
更紧密?
顺便说一下,当Dalgleish建议时,我不会得到......
你可以在jQuery中看到的一种技术就是引用一个额外的参数,该参数在执行匿名函数时没有定义,实际上为'undefined'创建了一个别名:
检查此代码:
function wacky(p1, undefined)
{
if (p1 === undefined)
window.alert('undef');
else
window.alert('not undef');
}
var var1;
// var1 is undefined. It works.
wacky(var1); // undef
// Now you have a truthy value saying it's undefined.
// Wack.
wacky("spam", "spam"); // undef?
// Just to round out possibilities -- now
// truthy is not truthy. I'm not even sure
// what we're checking any more. ;^)
wacky("spam", "not spam"); // not undef?
我无法找到任何理由打开undefined
被覆盖的内容。我理解动机,我想 - 如果你总是传递正确数量的参数,那么undefined
将没有相关的参数,并且从某种意义上来说,总是设置为undefined
。我想,你会更具防御性......
function wacky(p1)
{
var spam;
undefined = spam;
//...
}
或者,正如this answer suggests一样,使用void 0
来获得干净的undefined
。
但这可能绝对是多余的。当我尝试将全局范围内的undefined
设置为Chrome中的某些内容时,它不会让我感到高兴。检查this fiddle(很多提醒;抱歉)。
所以我买了this guy is selling。不要做undefined
参数技巧。如果你不小心用一个额外的参数调用一个函数,你就会进入一个痛苦的世界,Smokey。