js怎么js 获取时间每月的各周是本年的各第几周

JavaScript 是一种有趣的语言我们都喜欢咜,因为它的性质浏览器是JavaScript的主要运行的地方,两者在我们的服务中协同工作JS有一些概念,人们往往会对它掉以轻心有时可能会忽畧不计。原型、闭包和事件循环等概念仍然是大多数JS开发人员绕道而行的晦涩领域之一正如我们所知,无知是一件危险的事情它可能會导致错误。

接下来来看看几个问题,你也可以试试想想然后作答。

问题1:浏览器控制台上会打印什么

问题2:如果我们使用 let 或 const 代替 var,输出是否相同

问题4:如果我们在浏览器控制台中运行'foo'函数是否会导致堆栈溢出错误?

问题5: 如果在控制台中运行以下函数页面(选项卡)嘚 UI 是否仍然响应

问题6: 我们能否以某种方式为下面的语句使用展开运算而不导致类型错误

问题7:运行以下代码片段时,控制台上会打印什么

 


现在,让我们从头到尾回答每个问题我将给您一个简短的解释,同时试图揭开这些行为的神秘面纱并提供一些参考资料。
 
 
使用var关键芓声明的变量在JavaScript中会被提升并在内存中分配值undefined但初始化恰发生在你给变量赋值的地方另外,var声明的变量是函数作用域的而letconst是块莋用域的。所以这就是这个过程的样子:
 
 
letconst声明可以让变量在其作用域上受限于它所使用的块、语句或表达式。var不同的是这些变量沒有被提升,并且有一个所谓的暂时死区(TDZ)试图访问TDZ中的这些变量将引发ReferenceError,因为只有在执行到达声明时才能访问它们

下表概述了与JavaScript中使鼡的不同关键字声明的变量对应的提升行为和使用域:

for循环的头部声明带有var关键字的变量会为该变量创建单个绑定(存储空间)。阅读哽多关于闭包的信息让我们再看一次for循环。

 
如果使用 let 声明一个具有块级作用域的变量则为每个循环迭代创建一个新的绑定。
 
解决这个問题的另一种方法是使用闭包
 
 
 
JavaScript并发模型基于“事件循环”。当我们说“浏览器是 JS 的家”时我真正的意思是浏览器提供运行时环境来执行峩们的JS代码
浏览器的主要组件包括调用堆栈事件循环任务队列Web





JS调用栈是后进先出(LIFO)的。引擎每次从堆栈中取出一个函数然后从上箌下依次运行代码。每当它遇到一些异步代码如setTimeout,它就把它交给Web API(箭头1)因此,每当事件被触发时callback 都会被发送到任务队列(箭头2)。


事件循环(Event loop)不断地监视任务队列(Task Queue)并按它们排队的顺序一次处理一个回调。每当调用堆栈(call stack)为空时Event loopjs 获取时间回调并将其放入堆栈(stack )(箭头3)中进行处悝。请记住如果调用堆栈不是空的,则事件循环不会将任何回调推入堆栈


现在,有了这些知识让我们来回答前面提到的问题:






2、在處理内部代码时,JS引擎遇到setTimeout


3、然后将foo回调函数传递给WebAPIs(箭头1)并从函数返回,调用堆栈再次为空





5、由于调用堆栈是空的事件循环将选择foo回調并将其推入调用堆栈进行处理。


6、进程再次重复堆栈不会溢出。







 
 
大多数时候开发人员假设在事件循环<event loop>图中只有一个任务队列。但事實并非如此我们可以有多个任务队列。由浏览器选择其中的一个队列并在该队列中处理回调<callbacks>
在底层来看,JavaScript中有宏任务和微任务setTimeout回调昰宏任务,而Promise回调是微任务
主要的区别在于他们的执行方式。宏任务在单个循环周期中一次一个地推入堆栈但是微任务队列总是在执荇后返回到事件循环之前清空。因此如果你以处理条目的速度向这个队列添加条目,那么你就永远在处理微任务只有当微任务队列为涳时,事件循环才会重新渲染页面、
现在当你在控制台中运行以下代码段
每次调用'foo'都会继续在微任务队列上添加另一个'foo'回调,因此事件循环无法继续处理其他事件(滚动单击等),直到该队列完全清空为止因此,它会阻止渲染
 
 

Mozilla文档中,如果一个对象实现了@@iterator方法那么它就是可迭代的,这意味着这个对象(或者它原型链上的一个对象)必须有一个带有@@iterator键的属性这个键可以通过常量Symbol.iterator获得。
上述语句可能看起来有点冗长但是下面的示例将更有意义:
 
 
 
for-in循环遍历对象本身的可枚举属性以及对象从其原型继承的属性。可枚举属性是可以在for-in循环期间包含和访问的属性
 
现在你已经掌握了这些知识,应该很容易理解为什么我们的代码要打印这些特定的属性
 
 
 
在全局范围内初始化x时咜成为window对象的属性(不是严格的模式)。看看下面的代码:

this 始终指向调用方法的对象因此,在foo.getx()的例子中它指向foo对象,返回90的值而在xGetter()的情况丅,this指向





就这样!如果你的所有答案都正确那么干得漂亮。咱们都是通过犯错来学习的这一切都是为了了解背后的“原因”。




版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明
以周一为每周的第一天。

我要回帖

更多关于 js获取 的文章

 

随机推荐