Javascript 为什么可以';你不调用括号内声明的函数吗?

Javascript 为什么可以';你不调用括号内声明的函数吗?,javascript,Javascript,据我所知,JS是函数范围的,而不是块范围的,这意味着内部声明的对象(括号)不会创建不同的执行上下文。然而: $('#firstBtn').click(function first() { console.log("first activated"); }); $('#secondBtn').click(function() { console.log("second activated"); first(); }); 返回未定义的引用错误函数。函数first是在括号内

据我所知,JS是函数范围的,而不是块范围的,这意味着内部声明的对象(括号)不会创建不同的执行上下文。然而:

$('#firstBtn').click(function first() {
    console.log("first activated");
});

$('#secondBtn').click(function() {
    console.log("second activated");
    first();
});
返回
未定义的引用错误函数
。函数
first
是在括号内声明的,因此从技术上讲,它应该可用于从声明它的作用域调用它的其他函数

但这是可行的:

var callDat = $('#firstBtn').click(function first() {
    console.log("first activated");
});

$('#secondBtn').click(function() {
    console.log("second activated");
    callDat.first();
});

我的假设是,由于对象是函数,在对象内声明函数可以算作在不同的函数范围内声明的函数,即使没有大括号。但是,我希望对此有一个明确的答案。

在第二个示例中,您得到的第一个不是上面声明的方法—它是所有jQuery对象都可用的方法

这是可检查的-单击下面的“第一个”和“第二个”不会从单击第二个按钮输出“第一个激活”

var callDat=$('#firstBtn')。单击(函数first(){
控制台日志(“首次激活”);
});
$('#secondBtn')。单击(函数(){
控制台日志(“第二次激活”);
callDat.first();
});

弗斯特
第二个
返回未定义的引用错误函数。函数首先在括号内声明,因此从技术上讲,从声明它的作用域调用它的其他函数应该可以使用它

否。函数声明在其声明的范围内创建一个变量,该变量与函数具有相同的名称。函数表达式没有,即使它们是命名函数表达式。(命名函数表达式以在其自身范围内创建该名称的变量)

进一步阅读:

我的假设是,既然对象是函数

函数是对象。反之则未必如此

即使没有大括号,在对象内声明函数也可以算作在不同函数范围内声明的函数

不,它不能。

它是一个“函数文字”或“函数表达式”,它只将函数作为值返回,但不在周围的函数范围中将其定义为变量。但是,它有自己的范围。请参阅下面我的代码片段,了解一些非常有趣的内容:

var计数器=0;
//函数“b”作为要给“a”的值
var a=函数b(){
警报(计数器);
计数器++;
//“b”和“a”都可以在这里访问
if(计数器<3)b();
};

a();//在第一个示例中,您实际上创建了一个作用域-这是:

$('#firstBtn').click(function first() {
    console.log("first activated");
});
实际上是这样的:

(function first() {
    console.log("first activated");
})
因此,其他作用域不可用

现在-如果您将其声明为:

function first() {
    console.log("first activated");
}

$('#firstBtn').click(first);

$('#secondBtn').click(function() {
    console.log("second activated");
    first();
});

函数first()中不会出现错误{
第一个
是为从函数本身调用函数而创建的别名。
第一个
无法从
第一个
外部访问。请看一看。命名函数表达式!==函数声明。对于第二个示例,您跳到了完全错误的结论。我的错,第二个示例不起作用。但是我有在我提出我的“解决方案”之前,我脑子里有问题吗所以我认为它不应该被删除,尽管可能会被编辑以避免让更多的读者从我最初的询问中分心?那么,实际的问题是什么?所有这些都是函数表达式。要创建函数并将其放入当前范围,您可以使用函数声明。您只能确定某个内容是函数声明还是命名的通过查看周围的代码实现函数表达式:函数声明是语句,但函数表达式是表达式。我读过那篇文章,对此我有些理解。您回答了我的第二个示例-但第一个示例如何?两者都是声明函数。@BarAkiva-两者都不是函数声明。您只有函数表达。