JS命名函数表达式的a作用域及this指向window问题咨询
问题解答
1. 代码合法性说明
JavaScript 中函数的合法写法不止两种,除了你提到的函数声明function a(){}、匿名函数表达式var a = function(){}外,还有标准的具名函数表达式,你给出的var b = function a(){}; b();就属于这类合法写法,完全符合 ECMAScript 规范要求,不会抛出错误。
2. 标识符a的作用域说明
你朋友的说法是正确的,a的作用域仅局限于该函数自身内部,属于函数的局部作用域,在外部作用域无法直接访问a。可通过以下代码验证:
var b = function a() { // 函数内部可正常访问a,输出函数本身 console.log(a); } b(); // 外部访问a直接抛出错误:ReferenceError: a is not defined console.log(a);
这种写法的常见使用场景是函数递归:不会依赖外部变量,即使外部的函数引用b被修改,内部的标识符a依然指向当前函数本身,递归逻辑不会出错。
3. this指向的误区说明
你测试得到的this指向全局window的结果,和a的作用域是完全无关的两个概念:
- 作用域控制的是标识符的可访问范围,和函数的调用方式无关,在代码书写阶段就已经确定
this是函数运行时的上下文对象,完全由函数的调用方式决定
你两次测试的调用场景均为非严格模式下的普通函数直接调用,按照规范this默认绑定到全局window对象,该结果不能用来否定a的局部作用域特性。
内容的提问来源于stack exchange,提问作者Deadpool
相关产品推荐
相关产品推荐

