Javascript 函数在定义之前已被使用-JSLint
JSLint不喜欢这段代码说“'b'在定义之前就被使用了” 但我对此非常满意Javascript 函数在定义之前已被使用-JSLint,javascript,jslint,Javascript,Jslint,JSLint不喜欢这段代码说“'b'在定义之前就被使用了” 但我对此非常满意 var a, b; a = function () { b(); }; b = function () { alert("Hello, world!"); }; a(); 但我并没有在第二段代码中定义任何东西。我只是声明变量b 那么JSLint为什么要这么做呢?有什么理由我应该先声明我所有的函数吗 PS我知道我可以改变a和b的顺序,但在实际项目中,我的函数是事件处理程序,有时它们会互相调用
var a, b;
a = function () {
b();
};
b = function () {
alert("Hello, world!");
};
a();
但我并没有在第二段代码中定义任何东西。我只是声明变量b
那么JSLint为什么要这么做呢?有什么理由我应该先声明我所有的函数吗
PS我知道我可以改变a和b的顺序,但在实际项目中,我的函数是事件处理程序,有时它们会互相调用,所以这可能是不可能的。在C中,它是我们所称的前向声明,在JSLint中看起来可能是相同的。
JSLint知道b,在这一点上,b可以是一个函数(但如果它不是函数,当然会抛出一个错误)如果代码编写良好且面向对象,则可以在使用函数之前声明函数。但是JSLint设置了许多与应用程序功能几乎没有关联的标准,我真的怀疑以这种或那种方式声明函数是否会影响性能 那么JSLint为什么要这么做呢?有什么理由我应该先声明我所有的函数吗 是的,否则可能会出现一些意外错误。您的代码之所以能够工作,是因为JavaScript的“提升”。此机制会提取所有声明(隐式或显式),并可能导致一些意外结果 考虑以下代码:
var s = "hello"; // global variable
function foo() {
document.write(s); // writes "undefined" - not "hello"
var s = "test"; // initialize 's'
document.write(s); // writes "test"
};
foo();
其解释如下:
var s = "hello"; // global variable
function foo() {
var s; // Hoisting of s, the globally defined s gets hidden
document.write(s); // writes "undefined" - now you see why
s = "test"; // assignment
document.write(s); // writes "test"
}
foo();
(示例摘自德语维基百科页面:)它与解释器或js无关,只是jjsLint检查东西的方式。JSLint只是设计用来伤害你感情的代码质量工具。实际上,这段代码运行得非常好。
a
引用了b
之前存在的b
(当JavaScript从左到右执行时),在a
之前声明b
这段代码将消失。@shhacb
实际上存在,因为它是在被引用之前声明的。代码1的主要特点是,在函数中的任何位置声明var s都会安排整个函数范围的提升。不要介意它在第二行声明并在第一行调用-变量已经被提升。提升实际上与OP的第一个代码块相关吗?在定义b()
之后,才会调用a()
函数。JS引擎(不是JSLint)是否真正关心在声明时第一个函数中引用的变量b
是否存在?我认为只要语法正确就行。如果调用函数时它不存在,则会出现运行时错误。
var s = "hello"; // global variable
function foo() {
var s; // Hoisting of s, the globally defined s gets hidden
document.write(s); // writes "undefined" - now you see why
s = "test"; // assignment
document.write(s); // writes "test"
}
foo();