JS变量作用域——搜孤前端面试题

本文解析了JavaScript中变量作用域的困惑,重点讨论了var声明的局部变量与形参的交互,以及为何未使用var的函数参数被视为全局变量。通过实例演示了不同情况下的输出结果和作用域规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JS变量作用域——搜孤前端面试题

请给出这段代码的运行结果( )

<SCRIPT LANGUAGE="JavaScript">
var bb = 1;
function aa(bb) {
    bb = 2;
    alert(bb);
};
aa(bb);
alert(bb);
</SCRIPT>

答案是什么呢?

首先 var bb = 1 是通过值传递,第一个函数调用 aa(bb) 因为aa(bb)函数里面又重新对bb进行了赋值,所以第一个alert(bb)输出的是2,这没有太大问题。

问题是第2个alert(bb),因为函数aa(bb)里面的bb = 2。
因为没有加上var,所以算是全局变量,但是第二个alert(bb)的值输出却不是2,而是1。

为什么呢?

因为函数aa(bb)的形参名为bb。

假如形参名不是bb,改成cc:

在这里插入图片描述
如同上面这段代码一样,则输出是2 2。

而若是下面这段代码:
在这里插入图片描述
第二个alert(bb)输出的则是undefined,如图所示。

也就是说在这里,函数声明的时候,带了一个参数bb,也就是相当于在函数体内声明了var bb。
所以函数执行时会输出2。函数执行完后,函数的活动对象被销毁,也就是局部的这个bb被删除了,执行流进入到window,再输出bb,值就是1了。

### 作用域概念及其重要性 在 JavaScript 中,作用域决定了变量与函数的可访问性和生命周期。JavaScript作用域可以分为全局作用域、局部(函数)作用域以及块级作用域[^1]。 #### 全局作用域 当一段代码不在任何函数或其他结构内部声明时,则该部分代码处于全局作用域下。在此范围内定义的所有变量和函数都可以被整个程序任意位置所调用。 #### 函数作用域 每当创建一个新的函数,在这个新环境中定义的所有东西都只在这个特定的作用域内有效;一旦离开此环境就不能再直接访问这些成员了。需要注意的是,在 ES6 及之后版本引入 let 和 const 关键字之前,var 定义的变量即使是在 if 或者 for 这样的语句块里也会提升至最接近的一个函数或全局作用域顶部初始化。 ```javascript function exampleFunction() { var functionScopedVariable = "I'm only available inside this function"; } // 尝试在外层访问会报错 console.log(functionScopedVariable); // ReferenceError: functionScopedVariable is not defined ``` #### 块级作用域 ES6 引入了 `let` 和 `const` 来支持更细粒度的作用域控制——即所谓的“块级作用域”。这意味着如果在一个大括号 `{}` 内部使用这两个关键字之一定义了一个变量,那么它仅限于这对花括号之间的范围可见: ```javascript if (true) { let blockScopedVariable = 'This variable exists within the current block'; } // 外面无法访问 console.log(blockScopedVariable); // Uncaught ReferenceError: blockScopedVariable is not defined ``` ### 面试题中常见的作用域问题 - **闭包**:理解如何通过嵌套函数捕获外部作用域内的变量是非常重要的考点。闭包允许内部函数记住并访问其词法作用域中的数据,即便此时已经执行完毕并且不再处于栈上。 - **this 绑定规则**:不同上下文中 `this` 指向的对象可能会有所不同,掌握箭头函数与其他常规方式之间差异也是关键所在[^3]。 - **立即执行函数表达式(IIFE)**:为了防止污染全局命名空间,开发者经常采用 IIFE 技术来创建独立的作用域区域,从而保护私有属性不被外界干扰。 ```javascript (() => { const privateVar = 'safe from global scope interference'; })(); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值