为什么不能调用括号内声明的函数?

时间:2016-08-05 15:38:28

标签: javascript

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

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

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

返回Reference Error function is undefined。函数first正在括号内声明,因此从技术上讲,它应该可用于从声明的范围调用它的其他函数。

但这有效:

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

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

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

4 个答案:

答案 0 :(得分:5)

在您的第二个示例中,您获得的first不是您上面声明的那个 - 它是所有jQuery对象可用的jQuery.first方法。

这是可以检查的 - 点击" First"然后"第二"下面没有输出"首先激活"从点击到第二个按钮。



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

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

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="firstBtn">First</button>

<button id="secondBtn">Second</button>
&#13;
&#13;
&#13;

答案 1 :(得分:4)

  

返回引用错误函数未定义。函数首先在括号内声明,因此从技术上讲,它应该可用于从声明的范围调用它的其他函数。

没有。函数声明在声明的范围内创建一个变量,该变量与函数同名。函数表达式不会,即使它们是命名的函数表达式。 (命名函数表达式,用于在自己的作用域内创建该名称的变量)。

进一步阅读:JavaScript function declaration syntax: var fn = function() {} vs function fn() {}

  

我的假设是,因为对象是函数,

功能是对象。反过来不一定正确。

  

声明对象内部的函数可以计算为在不同的函数范围内声明,即使没有花括号

不,它不能。

答案 2 :(得分:1)

在第一个示例中,您实际上执行创建范围 - 这个:

$('#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();
});

你不会得到错误

答案 3 :(得分:0)

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

var counter = 0;

// function "b" is acting as a value to be given to "a"
var a = function b() {

  alert(counter);

  counter++;

  // both "b" and "a" are accessible in here
  if(counter < 3) b();

};

a(); // only a is accessible here

因为语法不明显,形式......

function func() { ... }

...可以用以下内容替换为更清楚:

var func = function() { ... };