在同一 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 上的 this
:https://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 都是原样。
更新: 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 上的 this
:https://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 都是原样。