javascript 函数作用域

从函数嵌套调用的列子中简要理解一下函数的作用域!
 
如下代码,对于y(x)这个函数的运行流程或者说背后的嵌套机制怎么理解更好?
 
 
以上面的代码为例:
 
   首先结果肯定是   // ReferenceError: a is not defined
 
  1. 可能会有疑问为什么不是2呢?
 
  2. y函数内部调用一个x函数打印一个a变量,
    不应该是像x函数的外一层 也就是y函数中寻找吗?
 
js中作用域于为词法作用域,并且变量的作用域只存在于函数体中。也就是一个变量的作用的确定是在JS代码编译阶段生成并附加在函数对象的[[scrope]]内部属性上(外部无法访问),
而不是在函数运行时确定
 
 
 
对于上面的函数表达式声明赋值来说,声明了一个变量x,这个x的作用的作用域为全局作用域(假设没有外层函数);x指向的匿名函数对象中使用的变量a,
因为在当前匿名函数体内没有声明过变量a,那么编译器就设置其作用域为全局作用域,也就是需要使用的到全局作用域下去查找。
 
 
上面代码声明函数对象f,函数体内的变量a的作用域被设定在函数f的作用域中,除了这个函数外层函数无法访问到。并且传入了一个参数f
 
 
 
 
函数对象f被调用,进而调用函数x,在函数x执行时,需要访问变量a;通过前面的分析,我们确定函数x中的变量a需要到全局对象中去寻找,但是没有找到,
渣都没有,JS引擎就报错ReferenceError: a is not defined
 
 
如果我们代码这样写:
 
 
那么函数x需要访问的变量a在外层函数(全局对象)能找到,就能正确输出~~
记住一点,函数体内变量的作用域是在函数定义的时候就确定的,而不是运行时!!!
posted @ 2020-12-29 18:34  李不懂。  阅读(166)  评论(0)    收藏  举报