function onMouseClickFunction() {
$mapCanvas.click(function (e) {
var x = cursor.getCursorPositionInCanvasX(e.pageX),
y = cursor.getCursorPositionInCanvasY(e.pageY);本例中的变量作用域是函数onMouseclickFunction还是jquery的匿名函数?
我想说的是,javascript在其父函数的顶部使用了hoisting创建变量,那么在这个例子中,hoisting是在哪里完成的呢?
发布于 2012-10-31 22:38:15
假设您指的是变量x和y,那么它就是传递给click()的匿名函数。
var的作用域始终为当前函数。
我想说的是javascript在它的父函数的顶部使用了提升创建变量,那么在这个例子中提升是在哪里完成的呢?
提升意味着当您使用var时,变量的作用域将是函数的作用域,即使您以前试图使用它。
即
function () {
var x = 1;
function () {
alert(x);
var x = 2;
}
}如果内部函数被调用,它将警告undefined,因为var x = 2在内部函数的作用域中创建了一个新的x (var被提升),但是赋值直到警报之后才发生(因为赋值没有被提升)。
问题中的所有var语句都出现在它们所在的函数的顶部,因此提升没有区别。
发布于 2012-10-31 22:37:44
每个正确声明的变量都将始终具有当前函数的局部作用域。
由于正确使用了var语句,因此x和y变量对于匿名函数是局部的。
如果希望能够从onMouseClickFunction函数访问这些变量,则应该在click事件处理程序外部声明它们。您仍然可以从单击处理程序中访问它们,因为该函数本身是在onMouseClickFunction函数中声明的。
这就是所谓的JavaScript范围链查找:如果您正在使用的变量没有在本地范围内声明,JavaScript将在当前范围的正上方的范围中查找该变量(对于匿名函数,该范围是外部onMouseClickFunction)。如果它也没有在那里声明,它将一直向上查找,直到它到达全局作用域。
如果通过作用域链找不到该变量,它将被声明为全局作用域中的新变量。这就是为什么必须始终使用var语句声明变量的原因,就像您所做的那样。
发布于 2012-10-31 22:38:56
应该是后者(匿名函数),因为它是声明变量的函数。
https://stackoverflow.com/questions/13160367
复制相似问题