Ebr*_*owi 56 javascript global-variables jslint
JSLint未将此作为有效代码传递:
/* global someVar: false */
if (typeof someVar === "undefined") {
var someVar = "hi!";
}
Run Code Online (Sandbox Code Playgroud)
什么是正确的方法?
big*_*ute 80
/*global window */
if (window.someVar === undefined) {
window.someVar = 123456;
}
if (!window.hasOwnProperty('someVar')) {
window.someVar = 123456;
}
Run Code Online (Sandbox Code Playgroud)
gvl*_*sov 13
/**
* @param {string} nameOfVariable
*/
function globalExists(nameOfVariable) {
return nameOfVariable in window
}
Run Code Online (Sandbox Code Playgroud)
使用var foo或window.foo创建全局变量无关紧要 - 将全局上下文中使用var创建的变量写入窗口.
mra*_*rak 12
如果您只想分配全局变量(如果它尚不存在),请尝试:
window.someVar = window.someVar || 'hi';
Run Code Online (Sandbox Code Playgroud)
要么
window['someVar'] = window['someVar'] || 'hi';
Run Code Online (Sandbox Code Playgroud)
尝试
variableName in window
Run Code Online (Sandbox Code Playgroud)
要么
typeof window[variableName] != 'undefined'
Run Code Online (Sandbox Code Playgroud)
要么
window[variableName] !== undefined
Run Code Online (Sandbox Code Playgroud)
要么
window.hasOwnProperty(variableName)
Run Code Online (Sandbox Code Playgroud)
我认为这实际上是JSLint的一个问题.它将发出以下错误:
意外的'typeof'.直接与'undefined'比较.
我相信这是一个糟糕的建议.在JavaScript中,undefined是一个通常未定义的全局变量.但有些浏览器允许脚本修改它,如下所示:window.undefined = 'defined'.如果是这种情况,直接比较undefined可能会导致意外结果.幸运的是,当前符合ECMA 5标准的浏览器不允许分配undefined(并将在严格模式下抛出异常).
我更喜欢typeof someVar === "undefined",正如你发布的那样,或者someVar in window像Susei所说的那样.
从 ES6 开始,大多数其他答案(包括已接受的答案)都是不正确的,因为由let或定义的全局变量const或由声明产生的全局变量在全局对象上(在浏览器或Node.js 中)class没有相应的属性。其中几个\xe2\x80\x94(主要是使用\xe2\x80\x94)也可能被存在但设置为 的全局变量所欺骗。windowglobaltypeofundefined
测试全局变量是否存在的唯一完全通用的方法\xe2\x80\x94,无论它是否已使用var,let或声明,通过or声明const创建,通过赋值创建(即,在程序的顶层,没有)的任何声明或通过在全局对象(即)\xe2\x80\x94 上创建属性来尝试通过全局访问它并查看是否引发 TypeError 。functionclassmyVar = valuemyVarwindow.myVar = valueeval
(这建立在 Ferran Maylinch 提出的想法的基础上,但有一个技巧可以确保即使封装在函数中也能正常工作。)
\nfunction globalExists(varName) {\n // Calling eval by another name causes evalled code to run in a\n // subscope of the global scope, rather than the local scope.\n const globalEval = eval;\n try {\n globalEval(varName);\n return true;\n } catch (e) {\n return false;\n }\n}\n\nundeclared = undefined;\nconst myConst = undefined;\nlet myLet;\nvar myVar;\n\nglobalExists(\'undeclared\') // => true\nglobalExists(\'myConst\') // => true\nglobalExists(\'myLet\') // => true\nglobalExists(\'myVar\') // => true\nglobalExists(\'nonexistent\') // => false\nglobalExists(\'globalExists\') // => true - can see itself.\nglobalExists(\'varName\') // => false - not fooled by own parameters.\nglobalExists(\'globalEval\') // => false - not fooled by local variable.\nRun Code Online (Sandbox Code Playgroud)\n请注意,这使用了eval,因此所有常见的注意事项均适用:您不应提供不受信任的值作为参数,并且如果必须使用不受信任的值,则应检查以确保它varName是有效的 JavaScript 标识符。这样做超出了这个问题的范围,但可以使用(相当复杂的)正则表达式\xe2\x80\x94 来完成,请注意,正确的正则表达式取决于您正在使用的 ECMAScript 版本、代码是否是脚本或(ES6)模块,无论是在异步函数中,等等。
Run Code Online (Sandbox Code Playgroud)if (typeof someVar === "undefined") { var someVar = "hi!"; }
将检查someVar(本地或全局)是否未定义。
如果要检查全局变量,可以使用
if(window['someVar'] === undefined) {
...
}
Run Code Online (Sandbox Code Playgroud)
假设这是在浏览器中:)
| 归档时间: |
|
| 查看次数: |
36894 次 |
| 最近记录: |