据我所知,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();
});
我的假设是,由于对象是函数,声明对象内部的函数可以计算为在不同的函数范围内声明,即使没有花括号。但我希望对此有一个明确的答案。
答案 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;
答案 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() { ... };