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

时间:2016-03-17 12:36:36

标签: javascript jslint

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

使用JSLint时收到以下消息:

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

我的代码就像:

System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
WebDriver driver = new ChromeDriver();

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

5 个答案:

答案 0 :(得分:1)

使用'这个'而不是声明/定义中的变量名称:

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

答案 1 :(得分:1)

最好使用this来引用您的用户:

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

您可能希望了解MDN上的thishttps://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/this

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

使用构造函数:

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

this关键字将创建一个新对象并将其绑定到user构造函数的myUser绑定,然后它将该新构造的对象返回到{{1}}

答案 4 :(得分:0)

绒毛

萨姆非常接近。这是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的param。如果你不想把它全部拿走,你可以(/*response*/)。如果您的代码稍后在该函数中使用response,请将其保留,natch!

如果您未将$http设置为require('http'),请道歉。改为适当的,自然。

无论如何,两个都是lint。