在同一 var 中使用 var 时 JSLint 超出范围

JSLint out of scope when using a var inside the same var

更新: user.forceLogout() 在另一个 http 请求函数中。

我在使用 JSLint 时收到以下消息:

'user' 超出范围。 user.forceLogout(); // 行...

我的代码是这样的:

var user = {
    logout: function () {
        var req = ... 
        $http(req).then(function (response) {
            user.forceLogout();
        });
    },
    forceLogout () {
       // code to force logout
    }
}

实现此类代码的正确方法应该是什么?

在declaration/definition中使用'this'代替变量名:

var user = {
    logout: function () {
        this.forceLogout();
    },
    forceLogout () {
        // code to force logout
    }
}

最好使用 this 来引用您的用户,例如:

var user = {
    logout: function () {
        this.forceLogout();
    },
    forceLogout () {
       // code to force logout
    }
}

您可能想阅读 MDN 上的 thishttps://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/this

您的代码在定义之前使用用户(在定义中)。 您可以这样定义它,而不是:

var user = {};
user.forceLogout = function(){};
user.logout = function(){ forceLogout(); };

使用构造函数:

var user = function() {
    var self = this;

    self.logout = function () {
        self.forceLogout();
    };

    self.forceLogout = function () {
       // code to force logout
    };
}

在函数中使用 this 关键字大部分时间都有效,但有时可以 weird things,这就是为什么我在构造函数的开头将它分配给 self user.

然后你像这样创建你的用户:

var myUser = new user();

new 关键字将创建一个新对象并将其绑定到 user 构造函数的 this 绑定,然后它将 return 新构造的对象进入 myUser.

棉绒

山姆非常接近。 the current version of JSLint.

支持(或至少接受)当前构造函数模式的一个转折点
/*jslint node, white */
var $http = require('https');

var user = (function() {
    "use strict";
    var userToReturn = {};

    userToReturn.forceLogout = function () {
        $http.someAction();      // kludge to keep from "empty block"
    };

    userToReturn.logout = function () {
        var req = {};            // just to push some code in to lint.
        $http(req).then(function (ignore) {
            userToReturn.forceLogout();
        });
    };

    return userToReturn;        // nicely protected object in closure.
}()); // immediate invocation gives you that `userToReturn` within closure.

user.logout(); // inserting to dodge "Unused 'user'." error

如果你想创建许多这样的工厂模式,你也可以创建一个带有非匿名函数的工厂模式。

更好

现在我认为这个解决方法是 JSLint 遗漏的案例,因为您在定义对象时仍然调用了附加到对象的函数,我敢打赌 JSLint 真正喜欢您做的是:

/*jslint node, white */
var $http = require('https');

var user = (function() {
    "use strict";
    var userToReturn = {};

    // private function for shared logic.
    function _forceLogout() {
        $http.someAction();     // kludge to keep from "empty block"
    }

    userToReturn.forceLogout = _forceLogout;

    userToReturn.logout = function () {
        var req = {};           // just to push some code in to lint.
        $http(req).then(function (ignore) {
            _forceLogout();
        });
    };

    return userToReturn;
}());

user.logout(); // inserting to dodge "Unused 'user'." error

创建一个闭包,分解出重复的代码,然后在该闭包中将其作为私有方法调用。


注意: 旧版本的 JSLint 可能会抱怨名为 ignore 的参数。如果你不想把它全部拿出来,你可以 (/*response*/)。如果您的代码稍后在该函数中确实使用了 response,请保留它,natch!

抱歉,如果您没有将 $http 设置为 require('http')。改成合适的,natch.

无论如何,lint 都是原样。