js中同名变量或者参数的优先级

本文详细解析了JavaScript中变量及参数的优先级规则,包括局部变量覆盖全局变量、形式参数优于函数名及arguments对象等场景,对理解JS作用域及执行上下文至关重要。

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

在javascript代码中,可能会出现一些变量或者参数重名的现象,所以要确认一下到底是哪一个变量或者参数在起作用,下面就对此进行一下简单的罗列性介绍,希望能够给需要的朋友带来帮助。

一.局部的优先级要高于全局变量:

var a=1;
function func(){
  var a=2;
  console.log(a);
}
func();

以上的输出结果是2,说明局部变量覆盖了全局变量。

二.形式参数的优先级高于函数名称:

function func(func){
  console.log(func)
}
func(2)

以上代码的输出只说明形参的优先级要高于函数的名称。

三.形式参数的优先级高于arguments对象:

[JavaScript] 纯文本查看 复制代码

function func(arguments){
  console.log(arguments)
}
func(2)

以上函数的输出值是2,这说明形参的优先级要高于arguments对象。

四.形式参数的优先级要高于声明确为赋值的变量:

function func(webName){
  var webName;
  console.log(webName);
}
func("测试");

以上代码的输出值是"测试",这说明形参的优先级要高于声明却为赋值的变量。否则的话,此函数的输出值为undefined。

五.形式参数的优先级要低于赋值的变量:

function func(webName){
  webName="测试一";
  console.log(webName);
}
func("测试");

以上代码的输出值是"测试一",所以赋值的变量的优先级要高于形式参数。

### 局部变量全局变量的作用域 局部变量是在函数或代码块内部声明的变量,其作用域仅限于该函数或代码块内部。这意味着局部变量只能在定义它的代码块内被访问修改,外部无法直接访问[^4]。例如,在以下代码中,`x` 是一个局部变量: ```python def example_function(): x = 10 print(x) example_function() # print(x) # 这行代码会引发 NameError,因为 x 是局部变量 ``` 全局变量则是在函数外部声明的变量,其作用域覆盖整个程序,可以在多个函数中被访问修改。例如: ```python y = 20 def another_function(): print(y) another_function() print(y) ``` ### 局部变量全局变量优先级关系 当局部变量全局变量同名时,在函数内部优先使用局部变量。这种规则被称为“局部变量优先”原则。如果在函数内部需要访问全局变量,则必须显式地使用作用域解析操作符(如 `::` 在 C++ 中)或者通过其他语言特定的方式进行区分。 例如,在 C 语言中: ```c #include <stdio.h> int count = 0; // 全局变量 void increment() { int count = 10; // 局部变量 printf("%d\n", count); // 输出局部变量的值 } int main() { increment(); return 0; } ``` 在这个例子中,尽管全局变量 `count` 存在,但在 `increment()` 函数内部,局部变量 `count` 被优先使用[^1]。 在 Python 中,可以通过 `global` 关键字来显式地引用全局变量: ```python count = 0 # 全局变量 def increment(): global count count += 1 increment() print(count) # 输出 1 ``` 如果没有使用 `global` 关键字,Python 会在函数内部创建一个新的局部变量而不是修改全局变量。 JavaScript 中的情况略有不同,由于变量提升机制的存在,即使在函数内部声明了同名变量,也会导致全局变量被隐藏: ```javascript var val = 10; function test() { console.log(val); // undefined var val = 100; console.log(val); // 100 } test(); ``` 在这个 JavaScript 示例中,虽然第一个 `console.log(val)` 看起来应该输出全局变量 `val` 的值 `10`,但由于变量提升,局部变量 `val` 已经存在但尚未赋值,因此输出为 `undefined` [^5]。 ### 生命周期与存储方式 局部变量的生命周期始于声明位置,结束于代码块执行完毕。它们通常存储在栈内存中,并且每次调用对应的函数或进入代码块时会创建新的副本,互不干扰。全局变量具有全局可见性,在整个程序中都可以访问修改,其生命周期从定义位置开始,直到程序结束[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值