2016-08-05 130 views
-3

据我所知,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(); 
}); 

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

+1

在'函数first(){''first''是从它自己调用函数时创建的别名。 'first'不能从'first'之外访问。 – Tushar

+1

看看[命名函数表达式揭秘](https://kangax.github.io/nfe/)。命名函数表达式!==函数声明。对于第二个例子,你跳到完全错误的结论。 –

+0

我的不好,第二个例子不起作用。然而,在我提出“解决方案”之前,我已经考虑过这个问题,所以我认为它不应该被删除,虽然可能是为了不让更多的读者分心我的原始查询。 –

回答

5

在第二个示例中,您得到的first不是您之前声明的那个 - 它对所有jQuery对象都可用的jQuery.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>

4

返回引用错误的功能是不确定的。该函数首先在括号内声明,因此在技术上它应该可用于其他函数,这些函数从它声明的范围调用它。

编号函数声明在它们声明的范围内创建一个变量,它与该函数具有相同的名称。函数表达式不会,即使它们是,也可以命名为函数表达式。 (命名函数表达式在其范围内创建该名称的变量)。

延伸阅读:JavaScript function declaration syntax: var fn = function() {} vs function fn() {}

我的假设是,由于对象是功能,

函数是对象。反过来并不一定是真的。

声明对象内部的功能可以算作声明不同的功能范围内,即使没有大括号

不,不能。

+0

我已经阅读过那篇文章,并且我对此有所了解。你回答我的第二个例子 - 但第一个呢?两者都是宣布的功能。 –

+3

@BarAkiva - 都不是函数声明。你只有函数表达式。 – Quentin

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() { ... }; 
1

在第一个例子mple你居然创建范围 - 这一点:

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

你不会得到错误

相关问题