【问题标题】:javascript/jquery function scopejavascript/jquery 函数作用域
【发布时间】:2012-10-31 14:36:33
【问题描述】:
function onMouseClickFunction() {
$mapCanvas.click(function (e) {
var x = cursor.getCursorPositionInCanvasX(e.pageX),
y = cursor.getCursorPositionInCanvasY(e.pageY);
这个例子中的变量作用域是函数 onMouseclickFunction 还是 jquery 的匿名函数?
什么是javascript使用提升在其父函数的顶部创建变量,那么在这个例子中提升是在哪里完成的?
【问题讨论】:
标签:
javascript
jquery
scope
【解决方案1】:
正确声明的每个变量都将始终具有当前函数的局部范围。
由于您正确使用了 var 语句,因此您的 x 和 y 变量是匿名函数的本地变量。
如果您希望能够从您的onMouseClickFunction 函数访问这些变量,您应该在您的click 事件处理程序之外声明它们。您仍然可以从点击处理程序中访问它们,因为该函数本身是在 onMouseClickFunction 函数中声明的。
这被称为 JavaScript 的作用域链查找:如果您使用的变量尚未在本地作用域内声明,JavaScript 将在当前变量上方的作用域中查找它(在匿名函数的情况下)是外部onMouseClickFunction)。如果它也没有在那里声明,它会一直向上查找,直到到达全局范围。
如果变量在作用域链的任何地方都找不到,它将被声明为全局作用域中的新变量。这就是为什么必须始终像您所做的那样使用var 语句声明您的变量。
【解决方案2】:
假设你的意思是变量x和y,那么它就是传递给click()的匿名函数。
var 始终作用于 current 函数。
什么是javascript使用提升在其父函数的顶部创建变量,那么在这个例子中提升是在哪里完成的?
提升意味着当你使用var时,该变量将被限定为函数的作用域,即使你之前尝试过使用它。
即
function () {
var x = 1;
function () {
alert(x);
var x = 2;
}
}
如果调用了内部函数,它会提醒undefined,因为var x = 2 在内部函数的范围内创建了一个新的x(var 被提升),但是直到分配才会发生在警报之后(因为任务没有被提升)。
问题中的所有var 语句都出现在它们出现的函数的顶部,因此提升没有区别。
【解决方案4】:
您在此处创建的是closure。
因此,匿名函数会继承onMouseClickFunction的作用域,但变量x和y只在匿名函数的作用域内。