JSLint 不将此代码视为有效代码:
/* global someVar: false */
if (typeof someVar === "undefined") {
var someVar = "hi!";
}
什么是正确的方式?
JSLint 不将此代码视为有效代码:
/* global someVar: false */
if (typeof someVar === "undefined") {
var someVar = "hi!";
}
什么是正确的方式?
/*global window */
if (window.someVar === undefined) {
window.someVar = 123456;
}
if (!window.hasOwnProperty('someVar')) {
window.someVar = 123456;
}
/*jslint browser: true */
代替/*global window */
。 - XP1if(!window.hasOwnProperty('someVar'))
。 - aaaaaaundefined = 'some value'
,会怎样? - gion_13/**
* @param {string} nameOfVariable
*/
function globalExists(nameOfVariable) {
return nameOfVariable in window
}
无论您是使用 var foo 还是 window.foo 创建全局变量,都不会影响结果——在全局上下文中创建的变量会被写入 window 对象中。
"foo" in window
。 - gvlasovwindow.hasOwnProperty("nameOfVar")
- gvlasov.hasOwnProperty()
是有问题的,因为可能会有一个全局变量在window
的原型链中更深处。它仍然是一个全局变量,但是.hasOwnProperty()
无法识别它。使用in
或者undefined
测试才是正确的方法。 - user2437417window
在那里是未定义的。 - cst1992如果您想要分配一个全局变量, 只有当它不存在时,请尝试:
window.someVar = window.someVar || 'hi';
或者window['someVar'] = window['someVar'] || 'hi';
someVar
包含像 0
或 ''
这样的值,它将把 'hi'
分配给它,而不是使用现有的值。 - hungerstar尝试
variableName in window
或者
typeof window[variableName] != 'undefined'
或者
window[variableName] !== undefined
或者
window.hasOwnProperty(variableName)
if ('prop' in obj) { do_it(); }
更清晰(即可读性更强且易于维护),比 if (obj.prop !== undefined) { do_it(); }
更好。我建议您在这种情况下忽略 JSLint。另请参阅 https://dev59.com/7mw15IYBdhLWcg3wGn9c。 - kstep我认为这实际上是一个JSLint的问题。它会发出以下错误:
意外的 'typeof'。直接与 'undefined' 比较。
我认为这是错误的建议。在JavaScript中,undefined
是一个全局变量,通常是未定义的。但是一些浏览器允许脚本对其进行修改,例如: window.undefined = 'defined'
。如果是这种情况,直接与undefined
进行比较可能导致意外的结果。幸运的是,当前符合ECMA 5标准的浏览器不允许对undefined
进行赋值(在严格模式下会抛出异常)。
我喜欢你发布的typeof someVar === "undefined"
,或者像Susei建议的someVar in window
。
if (typeof someVar === "undefined") {
var someVar = "hi!";
}
这段代码会检查 someVar
(本地或全局)是否未定义。
如果想要检查全局变量,可以使用
if(window['someVar'] === undefined) {
...
}
这是基于Ferran Maylinch提出的一个想法构建的(链接),但通过一种技巧来确保即使封装在函数中,它也能正常工作。
function globalExists(varName) {
// Calling eval by another name causes evalled code to run in a
// subscope of the global scope, rather than the local scope.
const globalEval = eval;
try {
globalEval(varName);
return true;
} catch (e) {
return false;
}
}
undeclared = undefined;
const myConst = undefined;
let myLet;
var myVar;
globalExists('undeclared') // => true
globalExists('myConst') // => true
globalExists('myLet') // => true
globalExists('myVar') // => true
globalExists('nonexistent') // => false
globalExists('globalExists') // => true - can see itself.
globalExists('varName') // => false - not fooled by own parameters.
globalExists('globalEval') // => false - not fooled by local variable.
eval
,因此所有常见的警告都适用:不应将不受信任的值作为参数提供,并且如果必须使用不受信任的值,则应检查varName
是否是有效的JavaScript标识符。 对于此问题,这样做超出了范围,但可以使用(相当复杂的)正则表达式来完成 - 只需注意正确的正则表达式取决于您正在使用的ECMAScript版本,代码是否为脚本或(ES6)模块,它是否在异步函数中等等。log
和const
指针的发现很好。我对eval
也感到好奇,如果用户没有提供varName
,那么评估变量名不应该是危险的用法,是吗?它如何被武器化?无论如何,我在MDN: never_use_eval!中发现了这个有趣的部分,可以用Function(`"use strict";return ${varName}`)();
来替换eval
。我已经测试过了,它完全正常! - Grubereval
相同的安全属性:只要其参数永远不受恶意操作者控制,它就是完全安全的。例如,如果您只传递有效变量名称的字符串文字,则它是无害的。我认为 永远不要使用 eval 不是 MDN 文档的亮点:Function
构造函数并不比 eval
更安全,我对所声称的速度优势持怀疑态度,并且 globalEval
技巧在范围控制方面同样出色。 - cpcallenbfavaretto 错误了。
将全局 undefined 设置为一个值不会改变对未定义对象的测试。请在您最喜欢的浏览器 JavaScript 控制台中尝试:
var udef; var idef = 42;
alert(udef === undefined); // Alerts "true".
alert(idef === undefined); // Alerts "false".
window.undefined = 'defined';
alert(udef === undefined); // Alerts "true".
alert(idef === undefined); // Alerts "false".
这是因为JavaScript忽略了对未定义变量尝试设置的所有值。
window.undefined = 'defined';
alert(window.undefined); // Alerts "undefined".
undefined
仍然可以被修改:这个函数是完全合法的:function foo(undefined, x) { if (x === undefined) { alert('undefined!'); } }
。如果你调用 foo(3)
,它将 不会 弹出警告。教训是 'undefined' 不总是指全局属性的引用。 - Ted Hoppif(window.variableName){
}
variableName
有任何 falsy 值(例如空字符串),则此方法无效,因此这可能不是一个足够的解决方案。 - Hinrichif(window.hasOwnProperty('foo')) {
console.log('Variable is not declared');
}
typeof foo === 'undefined'
typeof
处抛出错误,但现在typeof
似乎在任何地方都可以工作。无论是从节点进行交互式操作(node -e "console.log(typeof foo === 'undefined')"
),还是从devtools控制台(console.log(typeof foo === 'undefined') // true
)和从文件中(node test.js // true
)。即使使用了"use strict";
,也能正常工作。 - Shanimal
var
不会作用于if
块内部。这就好像在if
之前写了var someVar
一样。参考资料:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/var#var_hoisting - leewz