Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 函数在定义之前已被使用-JSLint_Javascript_Jslint - Fatal编程技术网

Javascript 函数在定义之前已被使用-JSLint

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的顺序,但在实际项目中,我的函数是事件处理程序,有时它们会互相调用

JSLint不喜欢这段代码说“'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
这段代码将消失。@shhac
b
实际上存在,因为它是在被引用之前声明的。代码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();