Javascript每日一题

2021-07-19 11:55 Javascript每日一题

输出是什么?

let scope = 'global'function checkscope() {  let scope = 'local'  function f(return scope }  return f()}checkscope() // ?
function checkscope0() {  let scope = 'local' function f() { return scope } return f}checkscope0()() // ?
function checkscope1({  let scope = 'local'  return () => scope}checkscope1()() // ?



单 选

    •  A: local, local, local    •  B: local, global, global    •  C: local, global, local    •  D: local, local, global




图片





图片

答案

图片





答案: A


请记住JavaScript词法作用域的基本规则:

Javascript执行时使用的是定义函数时生效的变量作用域,而不是调用函数时生成的作用域。


解析:

let scope = 'global' // 全局变量function checkscope() {  let scope = 'local' // 局部变量  function f(return scope } // 返回当前作用域中的值  return f()}checkscope() // local

checkscope()函数声明了一个局部变量,然后定义了一个返回改变量的值的函数并返回了该函数。很显然,调用checkscope()应该返回“local”。

function checkscope0() {  let scope = 'local'  function f() { return scope }  return f}checkscope0()()

上面代码中,我们把checkscope0()中的一对圆括号转移到了外部,checkscope0()返回的是一个函数。在 f 函数定义时,变量scope绑定的是local,这种绑定在执行 f 时仍然有效。 

function checkscope1() {  let scope = 'local'  return () => scope}checkscope1()()

上面这种情况其实和第二种是一类问题,只不过增加了箭头函数加以迷惑罢了。箭头函数的this是继承上下文的,所以它依然是 local 。还有,箭头函数是没有原型(prototype)的。



2021/07/19
本文章转载自公众号:javascript_daily

首页 - Javascript 相关的更多文章: