首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何正确访问传递给函数的JavaScript变量的名称?

在JavaScript中,变量名本身并不是对象的一部分,因此你不能直接访问一个变量的名称。但是,你可以通过一些技巧来间接获取变量名。

基础概念

在JavaScript中,变量名在编译阶段会被转换为内存地址,运行时并不保留变量名的信息。因此,直接获取变量名是不可能的。但是,你可以通过以下几种方法间接获取变量名:

  1. 使用闭包:通过闭包可以捕获变量名。
  2. 使用对象属性:将变量作为对象的属性存储,然后通过属性名获取。
  3. 使用arguments.callee(不推荐):在函数内部使用arguments.callee来获取当前函数的引用,但这在严格模式下是不允许的。

相关优势

  • 闭包:闭包可以让你在一个函数内部访问外部函数的变量,从而间接获取变量名。
  • 对象属性:通过对象属性存储变量,可以方便地通过属性名获取变量名。

类型

  • 闭包:函数内部访问外部变量的机制。
  • 对象属性:通过对象的键值对存储变量。

应用场景

  • 调试:在调试过程中,有时需要知道某个变量的名称。
  • 日志记录:在记录日志时,可能需要输出变量的名称和值。

示例代码

使用闭包获取变量名

代码语言:txt
复制
function getVariableName(variable) {
  for (let name in this) {
    if (this[name] === variable) {
      return name;
    }
  }
  return null;
}

const myVar = 10;
const name = getVariableName.call({ myVar }, myVar);
console.log(name); // 输出: myVar

使用对象属性获取变量名

代码语言:txt
复制
const variables = {
  myVar: 10,
  anotherVar: 20
};

for (let name in variables) {
  console.log(name, variables[name]);
}
// 输出:
// myVar 10
// anotherVar 20

遇到的问题及解决方法

问题:在严格模式下,arguments.callee不可用

原因:在ES5严格模式下,arguments.callee是被禁止的,因为它会导致一些性能问题和安全问题。

解决方法:使用其他方法来获取变量名,如上述的闭包或对象属性方法。

参考链接

通过这些方法,你可以在JavaScript中间接获取变量的名称。希望这些信息对你有所帮助!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何写出优雅 JS 代码,变量函数正确写法

在开发中,变量名,函数名一般要做到清晰明了,尽量做到看名字就能让人知道你意图,所以变量函数命名是挺重要,今天来看看如果较优雅方式给变量函数命名。...isActiveClient(client) { const clientRecord = database.lookup(client); return clientRecord.isActive(); } 函数名称应说明其作用...// 不好写法 function addToDate(date, month) { // ... } const date = new Date(); // 从函数名称很难知道添加什么 addToDate...删除重复代码意味着创建一个仅用一个函数/模块/类就可以处理这组不同事物抽象。 获得正确抽象是至关重要,这就是为什么我们应该遵循类部分中列出 SOLID原则。...hash.has(elem)); } } 尽量使用函数式编程而非命令式 JavaScript不像Haskell那样是一种函数式语言,但它具有函数风格。函数式语言可以更简洁、更容易测试。

3.8K30
  • 简洁javascript编码(一)--变量函数

    本文作者:IMWeb jaychen 原文出处:IMWeb社区 未经同意,禁止转载 一、变量 使用语义化变量名称 Bad const yyyymmdstr = moment().format...类似与函数单一职责,当你函数超过一层抽象时,说明你函数做太多事情了。.../temp/${name}`); } 避免副作用 如果某个函数除了接收输入值与返回值之外还做了其他事,那么就称其具有副作用。典型副作用譬如写文件、修改某些全局变量、修改内存参数等等。...Bad: // 定义全局变量 // 如果我们有其他函数引用了该变量,那么我们就无法预测该变量类型 let name = 'Ryan McDermott'; function splitIntoFirstAndLastName...,没有if条件选择语句的话又该如何编程呢?

    2.1K90

    【Python】循环语句 ⑥ ( 变量作用域 | for 循环临时变量访问 | 分析在 for 循环外部访问临时变量问题 | 在 for 循环外部访问临时变量正确方式 )

    for 循环临时变量 在 循环体外部也可以访问 , 但是不建议这么做 , 代码不够规范 ; 如果需要在外部访问 for 循环临时变量 , 建议将该 临时变量 预定义在 for 循环外部 , 然后在后续所有代码中可以访问该...临时变量 ; 一、变量作用域 1、for 循环临时变量访问 下面的 for 循环中 , 临时变量 i 变量 作用域范围 , 仅限于 for 循环语句内部 , 但是在 for 循环外部可以访问到临时变量...for 循环中临时变量 i # 但是此处可以访问到 临时变量 i print(i) 理论上说 , for 循环中 临时变量 是 临时 , 只在 for 循环内部生效 , 在 for 循环外部不应该生效...; 但是 如果在 for 循环外部 访问该临时变量 i 是可以访问 , 上述代码执行结果如下 : 0 1 2 2 2、分析在 for 循环外部访问临时变量问题 下面分析一下上述 在 for 循环外部访问...不建议使用 , 会造成代码不可维护 , 以及其它未知错误 ; 但是从编译规则上 , 这种用法并不报错 , 程序可以跑通 , 写出这种代码就是低级程序员 ; 3、在 for 循环外部访问临时变量正确方式

    57140

    用 awaitasync 正确链接 Javascript多个函数

    我发现大多数关于链接多个函数文章都没有用,因为他们倾向于发布从MSDN 复制粘贴不完整演示代码。...这是连接多个函数工作代码,等待解决所有问题,然后 then 发送结果。...这个调试是非常烦人。 在云函数中,你必须发送带有 res.send() 响应,否则函数会认为它失败并重新运行它。...为此,我们将 saveToCloudFireStore() 和 sendEmailInSendgrid() 响应(它们返回内容)保存到变量中,其唯一目的是标记上述函数何时完成。...这在某种意义上取代了 .then():它等待这两个变量( savedToCloud 和 sentEmail)“到达”(他们 Promise 已经解决),然后运行 res.send)() 。

    6.3K30

    如何禁止函数值调用

    对于基本数据类型变量作为实参进行参数传递时,采用值调用与引用调用和指针调用效率相差不大。但是,对于类类型来说,值调用和引用调用之间区别很大,类对象尺寸越大,这种差别越大。...值调用与后面两者区别在于值调用在进入函数体之前,会在栈上建立一个实参副本,而引用和指针滴啊用没有这个动作。建立副本操作是利用拷贝构造函数进行。...2.显示定义拷贝构造函数并将访问权限设置为private 上面的程序添加拷贝构造函数定义,修改如下。...原因是如果拷贝构造函数参数不是一个引用,即形如A(const A a),那么就相当于采用了方式(pass-by-value),而方式会调用该类拷贝构造函数,从而造成无穷递归地调用拷贝构造函数...作为实参以值传递方式传递给一个函数; c. 在函数体内返回一个对象时,也会调用返回值类型拷贝构造函数; d. 需要产生一个临时类对象时(类对象作为函数返回值会创建临时对象)。

    2.8K10

    详解JavaScript变量提升函数提升

    先抛出一个问题: 先有鸡还是先有蛋:直觉上会认为 JavaScript 代码在执行时是由上到下一行一行执行。但实际上这并不完全正确,有一种特殊情况会导致这个假设是错误。...但只有声明本身会被提升,而赋值或其他运行逻辑会留在原地 javascript并不是严格自上而下执行语言 变量声明提升: 1....JavaScript变量提升是针对var,而let和const不存在变量提升这一特性(let与const具有一个临时死区概念,后续在es6总结中会提到) 2.通过var定义变量,在定义语句之前就可以访问到...没有使用var定义,会造成zxx函数中没有变量声明,所以zxx里面访问变量a,其实都是访问全局变量a,a = 20 又相当于给全局变量a重新赋值20 函数声明提升 通过function声明函数,在之前就可以直接调用...当前函数声明和变量声明使用同一个变量名称时,函数优先级高于变量优先级 console.log(zxx) // 会输出zxx定义函数 function zxx () {

    1.5K30

    C++如何禁止函数值调用

    对于基本数据类型变量作为实参进行参数传递时,采用值调用与引用调用和指针调用效率相差不大。但是,对于类类型来说,值调用和引用调用之间区别很大,类对象尺寸越大,这种差别越大。...值调用与后面两者区别在于值调用在进入函数体之前,会在栈上建立一个实参副本,而引用和指针调用没有这个动作。建立副本操作是利用拷贝构造函数进行。...2.显示定义拷贝构造函数并将访问权限设置为private 上面的程序添加拷贝构造函数定义,修改如下。...原因是如果拷贝构造函数参数不是一个引用,即形如A(const A a),那么就相当于采用了方式(pass-by-value),而方式会调用该类拷贝构造函数,从而造成无穷递归地调用拷贝构造函数...显式或隐式地用同类型一个对象来初始化另外一个对象; b. 作为实参以值传递方式传递给一个函数; c. 在函数体内返回一个对象时,也会调用返回值类型拷贝构造函数; d.

    2.4K30

    正确理解 golang 函数变量作用域, 管你 defer 不 defer

    你以为面试中 defer 是在考 defer 吗?并不是,其实是在考 函数变量作用域 以下这是 go语言爱好者 97 期一道题目。要求很简单, 代码执行 i, j 值分别是什么。...核心: 函数变量作用域 defer 执行时间 闭包 指针 知识点 这里面所有的内容都可以在 Effective Go 中解决 贪婪算法 什么是贪婪算法, 就是找到局部最优解, 合并后就是全局最优解。...所以通常面试中有 defer 问题都不是在考 defer , 只不过是披上了 defer 狼皮。 函数及返回值 其实 go 中关于函数返回花样还是挺多。...如果对 函数变量作用域 理解不清楚的话, 就容易掉坑。...~r2 变量名, 其 等价于 NamedResult 函数变量x 汇编中 RET后没有带任何参数 所有与结果有关操作都标记了 (SP) , ex: MOVQ AX, "".

    74720

    如何深度理解JavaScript回调函数

    首先,回调函数这个概念,他是JS中一个核心。 作为JS核心,回调函数和异步执行是紧密相关,也是必须跨过去一道个门槛。 当然,我们这篇文字只谈回调,不说异步。 对象?...JavaScript有对象嘛? 我们知道,JavaScript他不是一个面向对象语言,但是,我们JavaScript是一个基于对象脚本语言。...啥意思,也就是基本上,JavaScript里面的函数啊,变量啊,这些都是一个对象,当然这个概念不是像面向对象语言那样。 回调? 看这张图,是一个简单回调函数,怎么回调了呢?...在一个函数里面,我们将另一个函数作为参数,并在函数体内部调用它。在 JavaScript 里,我们叫它 “回调” 。所以,被传递给另一个函数作为参数函数叫作回调函数。 为什么需要回调函数?...但是我们上面说了,JavaScript他是一个逐行执行语言,那咋还能不按顺序来呢? 这是是我们所说异步编程,即没有按照原本顺序来逐行执行。

    1.3K20

    如何正确访问Redis中海量数据?服务才不会挂掉!

    一、前言 有时候我们需要知道线上Redis使用情况,尤其需要知道一些前缀key值,让我们怎么去查看呢?并且通常情况下Redis里数据都是海量,那么我们访问Redis中海量数据?...如何避免事故产生!今天就给大家分享一个小知识点,希望大家轻喷。 二、事故产生 因为我们用户token缓存是采用了【user_token:userid】格式key,保存用户token值。...四、解决方案 那我们如何去遍历大数据量呢?这个也是面试经常问。我们可以采用Redis另一个命令scan。...; 服务器不需要为游标保存状态,游标的唯一状态就是 scan 返回给客户端游标整数; 返回结果可能会有重复,需要客户端去重复,这点非常重要; 单次返回结果是空并不意味着遍历结束,而要看返回游标值是否为零...,也是我们小伙伴在工作过程经常用,一般数据量不大时候,不会有什么问题,但数据量多时候,你操作方式不对,你绩效就会被扣哦。

    1.3K10

    如何正确访问Redis中海量数据?服务才不会挂掉!

    目录 前言 事故产生 分析原因 解决方案 总结 前言 有时候我们需要知道线上redis使用情况,尤其需要知道一些前缀key值,让我们怎么去查看呢?...今天老顾分享一个小知识点 事故产生 因为我们用户token缓存是采用了【user_token:userid】格式key,保存用户token值。...解决方案 那我们如何去遍历大数据量呢?这个也是面试经常问。我们可以采用redis另一个命令scan。...; 服务器不需要为游标保存状态,游标的唯一状态就是 scan 返回给客户端游标整数; 返回结果可能会有重复,需要客户端去重复,这点非常重要; 单次返回结果是空并不意味着遍历结束,而要看返回游标值是否为零...也是我们小伙伴在工作过程经常用,一般小公司,不会有什么问题,但数据量多时候,你操作方式不对,你绩效就会被扣哦,哈哈。

    1.4K20

    如何JavaScript访问暂未存在嵌套对象

    JavaScript 是个很神奇东西。但是 JavaScript一些东西确实很奇怪,让人摸不着头脑。...其中之一就是当你试图访问嵌套对象时,会遇到这个错误 Cannot read property 'foo' of undefined 在大多数情况下,处理嵌套对象,通常我们需要安全地访问最内层嵌套值。...Oliver Steele嵌套对象访问模式 这是我个人最爱,因为它使代码看起来干净简单。 我从 stackoverflow 中选择了这种风格,一旦你理解它是如何工作,它就非常吸引人了。...做法是检查用户是否存在,如果不存在,就创建一个空对象,这样,下一个级别的键将始终从存在对象访问。 不幸是,你不能使用此技巧访问嵌套数组。...除了安全访问嵌套对象之外,它还可以做很多很棒事情。

    8K20

    如何正确访问Redis中海量数据?服务才不会挂掉

    如何正确访问Redis中海量数据?服务才不会挂掉 前言 有时候我们需要知道线上redis使用情况,尤其需要知道一些前缀key值,让我们怎么去查看呢?...今天老顾分享一个小知识点 事故产生 因为我们用户token缓存是采用了【user_token:userid】格式key,保存用户token值。...解决方案 那我们如何去遍历大数据量呢?这个也是面试经常问。我们可以采用redis另一个命令scan。...; 服务器不需要为游标保存状态,游标的唯一状态就是 scan 返回给客户端游标整数; 返回结果可能会有重复,需要客户端去重复,这点非常重要; 单次返回结果是空并不意味着遍历结束,而要看返回游标值是否为零...也是我们小伙伴在工作过程经常用,一般小公司,不会有什么问题,但数据量多时候,你操作方式不对,你绩效就会被扣哦,哈哈。

    8710
    领券