js对象的属性赋值的lint错误

时间:2014-11-18 00:04:25

标签: javascript design-patterns jslint

使用这种模式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来初始化它,它将在以后使用。

编辑,修改问题..

1 个答案:

答案 0 :(得分:1)

说实话,这段代码有点混乱(见下面的项目符号),而且我还不确定问题到底是什么。我将假设它"我如何抓住这些代码"。这是一种方式。

请注意my comment,我的意思是将您的代码带到JSLint.com并让它在那里工作,而无需打开任何开关(在您开始执行时将它们打在文件的顶部;那&# 39;好的)。您的代码中仍然存在许多明显的错误,例如每个函数分配上的额外结束错误。

[编辑:删除了之前的代码,替换为以下内容。如果它有用,您可以在编辑历史记录中看到旧内容]

所以这里有一些指示:

  • 您已获得范围问题。如果您将window.app.aModule作为aModule传递,则没有理由在您的函数中继续使用全局句柄app.aModule。 (我从那些引用中删除了全局上下文。)编辑:如果你想做匿名封闭技巧,那么1.)不要传递全局和2.)确保你在某个地方有一个私有变种,或者你在浪费这个伎俩!
  • 功能声明中的结束语 - 我会假设这是一个粗心的错误,但是如果你打算做某事,它是什么?
  • 请注意,为了让JSLint满意,您需要使用您定义的内容并定义您使用的内容 - 必须使用函数中的params,并且必须定义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。