为正在构建 alis4ops.com 的父亲撰写本指南。
我们有以下功能:
DragDrop.js 中定义的 Baba
function handleStartTouch(event) { draggedElement = event.target; const touch = event.touches[0]; touchStartX = touch.clientX - draggedElement.getBoundingClientRect().left; touchStartY = touch.clientY - draggedElement.getBoundingClientRect().top; } function handleMoveTouch(event) { event.preventDefault() if (draggedElement) { const touch = event.touches[0]; // ..more code } }
注意我们正在在线访问draggedElement:
hanldeMoveTouch 调用时不会引发错误。
在 Chrome DevTools 中的 if (draggedElement) 上放置断点将显示dragedElement解析为handleStartTouch中的event.target提供的相同html元素
为什么在handleStartTouch中定义了draggedElement,却可以在handleMoveTouch中访问draggedElement
更一般地说,为什么我们可以在javascript中的另一个函数中访问在一个函数中定义的变量?
看handleStartTouch函数:
function handleStartTouch(event) { draggedElement = event.target; const touch = event.touches[0]; touchStartX = touch.clientX - draggedElement.getBoundingClientRect().left; touchStartY = touch.clientY - draggedElement.getBoundingClientRect().top; }
具体行:
draggedElement = event.target;
它不使用任一关键字声明变量名dragedElement
例如,我们不是这样定义它的:
const draggedElement = event.target;
在Javascript中,当我们不使用变量声明(也称为关键字)时,javascript认为该变量是全局变量.
考虑以下示例,其中我们定义了两个函数:
// Takes in two arguments and returns the sum function add(x, y) { sum = x y return sum } // prints sum if it is defined function printStatus() { if (sum) { console.log("Sum: ", sum) } else { console.log("Sum does no exist") } }
在 Chrome 中打开 DevTools
在控制台中调用add(1,1)
add(1,1) => 2
然后调用 printStatus
我们可以看到printStatus()可以访问add(x, y)中定义的变量sum
这是因为变量 sum 是在没有以下关键字的情况下声明的:
现在让我们更改 add(x, y) add 以使用 sum
的变量声明
// Takes in two arguments and returns the sum function add(x, y) { const sum = x y // use the variable declartion const return sum } // prints sum if it is defined function printStatus() { if (sum) { console.log("Sum: ", sum) } else { console.log("Sum does no exist") } }
我们再定义一下控制台日志中的函数。
我们需要重新定义它,因为我们启动了一个新的开发控制台。
现在在控制台中,调用 add(2, 2)
调用printStatus查看是否可以访问add(x, y)中定义的变量sum
printStatus() > Uncaught ReferenceError: sum is not defined at printStatus (:9:3) at :1:1
错误提示 sum 未定义
这证实了当在函数内使用变量声明(const、let、var)定义变量时,该变量的作用域仅在函数内
当定义变量时而没有函数内的变量声明,该变量的作用域是全局的。
希望这对巴巴(以及其他读到这篇文章的人有帮助。)
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3