是否可以在 Javascript 中将未声明的变量作为参数传递?

2024-04-29

假设我有一个变量myvar, and I don't有一个变量myvar2。我可以毫无问题地运行以下命令:

typeof myvar
// ⇒ 'string'
typeof myvar2
// ⇒ 'undefined'

typeof and delete这是我所知道的唯一在给定像这样的未定义参数时不会抛出错误的函数。我在看语言规范typeof http://www.ecma-international.org/ecma-262/5.1/#sec-11.4.3在我外行看来,它似乎使用了内部函数,例如IsUnresolvableReference.

Edit: I'd been working in a language that checks type with a synonymous function https://stat.ethz.ch/R-manual/R-devel/library/base/html/typeof.html, and hadn't noticed typeof is actually an operator in JavaScript. I've removed parentheses from the code here but left the above as written.

当我创建一个函数时:

function myFunc(input_variable) {
  return("hello");
}

...正如预期的那样,这会引发ReferenceError当通过时myvar2作为参数,除非我运行var myvar2;.

如果我将退货包裹在try/catch声明来处理myvar2 未定义在这种情况下,我仍然遇到相同的错误,因为变量似乎在进入函数时检查可解析的引用(在运行时?):

function myFunc(input_var) {
  try {
    return "hello";
  } catch(error) {
    if (error.name === 'ReferenceError'){
      return "world";
    }
  }
}

我想知道如何创建一个接受未解析引用的函数。我的一般猜测是,如果这是函数的标准行为,那么也许我可以专门修改此构造的一些原型......?我知道原型是针对对象的,我想知道这种级别的控制是否function有可能吗?

通过上下文,我总是发现自己在写作function(input_var) :

if (typeof input_var == 'undefined' || my_settings.input_var_is_optional === true)
  var input_var = 'Sometimes variables are optional. This is my default value.';
  return dealWith(input_var);
} else if (typeof input_var == 'string') {
    return dealWith(input_var);
} else {
  // Already checked that input_var isn't optional, so we have a problem
  return false; // or throw a TypeError or something like that
}

但是所有这些简单的冗长让我无法在代码中编写类型检查,从而使更自由地使用函数或传递给其他开发人员的功能变得不那么健壮。

我想写一个类型处理函数,e.g.

对于一个函数myFunc(input_var), 如果变量作为参数传入input_var已定义,检查它是否是字符串,否则将其设置为"default_value"。如果没有定义,也将其设置为"default_value",否则它是一个有效的字符串,所以只需使用input_var as is.

...但事实是,我实际上无法传递任何未定义的内容,这实际上阻止了我将这种复杂性隔离在一个单独的函数中,我只能向该函数传递两个参数:input_var(真正的交易,不仅仅是它的名字),以及expected_type.

function typeTest(input_var, expected_type) {
  var is_optional_value = (typeof expected_type != 'undefined'
                                                 && expected_type === true);
  var optional_str = is_optional_value ? "|(undefined)" : ''
  var type_test_regex = RegExp('^(?!' + expected_type + optional_str + '$)');
  var is_expected_type = type_test_regex.test(typeof(input_var));
}

例如,要检查传递给函数的可选变量是否已定义,并且已定义为字符串,

var myvar = 'abc'
//  myvar2 is never defined

// Mandatory type (expecting a string):
typeTest(myvar, 'string'); // true
// if (/^(?!string)$)/.test(typeof(myvar))
typeTest(myvar2, 'string'); // throws error

// Mandatory type (expecting a number):
typeTest(myvar, 'number'); // false
typeTest(myvar2, 'number'); // throws error

// Optional type ("expected is true"):
typeTest(myvar, true); // true
// if (/^(?!string|(undefined)$)/.test(typeof(myvar))
typeTest(myvar2, true); // throws error

我想知道如何创建一个接受未解析引用的函数。

你不能。当您访问未声明的变量时,ReferenceError发生在函数被调用之前。您无法在函数内部执行任何操作来恢复此情况,因为它甚至还没有被调用。

typeof 和 delete 是我所知道的唯一在给定像这样的未定义参数时不会抛出错误的函数。

typeof and delete不是函数。这就是为什么。

例如,检查传递给函数的可选变量是否已定义以及是否定义为字符串。

没有什么可以阻止你这样做。两者之间存在差异:

  • 具有值的变量undefined
  • 未传值的参数
  • 未声明的变量。

处理前两个是没有问题的:

function hasType(val, type) {
  return typeof val === type;
}

function myFunc(param1, param2) {
  console.log('param1: ', hasType(param1, 'string'));
  console.log('param2: ', hasType(param2, 'string'));
}

myFunc('hello');

无需检查是否有人尝试使用以下命令调用您的函数未申报的变量。如果是,那么问题出在他们的代码上,他们需要修复它。如果他们利用optional参数,这是另一回事,你可以很好地处理这种情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在 Javascript 中将未声明的变量作为参数传递? 的相关文章

  • 计算字符串中的唯一单词

    下面我尝试将字符串数组提供给一个函数 该函数将唯一单词添加到单词数组中 并且如果该单词已经在数组中 则增加计数数组中相应元素的计数 var words var counts calculate a b calculate a c funct
  • 使用把手显示来自 parse.com 的 json 响应

    我想将 json 响应传递给车把 我已经查看了解析文档和 stackoverflow 问题 但我似乎无法弄清楚这一点 这是回应 results address 755 W Yale createdAt 2013 02 09T01 12 15
  • 不使用 PHP 提交联系表单

    我还是一名学生 今天我们的讲师告诉我们 无需使用 mailto 函数即可提交联系我们表单的唯一方法是使用 PHP 我发誓去年另一位讲师向我们展示了一种仅使用 javascript 的方法 是否可以使用基本表单和 javascript 提交反
  • 如何将事件对象传递给 JavaScript 中的函数?

  • asp.net 将值从 JS/jquery 传递到 C# 背后的代码

    我已经尝试了 所有 可能的方法 将 screen width vlaue 从 aspx 页面上的 JS 脚本发送到后面代码中的 c 虽然我可以看到 screen width 被正确分配 但它永远不会分配给我的隐藏字段价值
  • Excel 宏与 Javascript

    我希望使用 Javascript 中的宏而不是默认的 VBA 来操作 Excel 电子表格 我可以使用以下 VBA 代码执行 javascript 代码 javascript to execute Dim b As String b fun
  • LINQ:从类型 T 的列表中,仅检索某个子类 S 的对象

    给定一个简单的继承层次结构 人 gt 学生 教师 职员 假设我有一个人员列表 L 该列表中有一些学生 教师和工作人员 使用 LINQ 和 C 有没有办法编写一个只能检索特定类型人员的方法 我知道我可以做类似的事情 var peopleIWa
  • 将字符串(是一个函数)转换回 Javascript 中的函数

    我在下面将此函数作为字符串 我如何将其转换回函数 我正在从 JQuery 事件中提取事件处理程序 我想将它们存储为字符串 然后将它们转换回来 因为它们将保存在 mySQL 中 function if GActiveClick return
  • 修剪日期格式 PrimeNG 日历 - 删除时间戳、角度反应形式

    我将以下内容推入我的反应形式 obj 中2016 01 01T00 00 00 000Z但我想要以下2016 01 01 有谁知道有一个内置函数可以实现上述目的 我已经搜索过文档here https www primefaces org p
  • IE8 中空 div 层的 z-index 问题

    我在 IE8 中遇到 z index 问题 其他尚未测试 以下 JS 创建一些 html css document write img src border 0 document write div style background col
  • 如何在美人鱼节点描述中添加链接?

    我想 如下图所示 div class mermaid graph TD A hello B an b important b link A gt B div 在下面添加实际链接link指向http google com 我尝试将相关节点修改
  • 在 JQuery ui 自动完成中显示图像

    我有一个带有 JQuery ui 自动完成功能的脚本 可以完美运行 有一个显示用户名字和姓氏的搜索过程 但在我的数据库中 还有用户的图片 我想将其显示在带有名字和姓氏的建议中 数据库中pic包含图片url 剧本 function searc
  • 可选回调的 JavaScript 样式

    我有一些函数偶尔 并非总是 会收到回调并运行它 检查回调是否已定义 函数是一种好的风格还是有更好的方法 Example function save callback do stuff if typeof callback undefined
  • JavaScript 中的最短路径

    几周来我一直在寻找一种在 JavaScript 中计算最短路径的方法 我一直在玩书数据结构和算法作者 格罗纳 Groner 名字恰如其分 https github com loiane javascript datastructs algo
  • Socket.io 与服务器离线连接

    如何检测服务器是否离线或由于其他原因无法连接 我的代码看起来像这样 this socket io connect connectionInfo reconnect false 它不会抛出任何错误 因此 try catch 子句不起作用 Us
  • 使用 javascript/jquery 从数据库格式化日期的正确方法

    我正在调用包含日期时间数据类型的数据库 日期看起来像这样 2005 05 23 16 06 00 000 当用户从列表中选择某个项目时 我想在表格中显示它 我调用我的控制器操作并返回所有时间的 Json 并将它们放入表中 问题是日期完全错误
  • YouTube iFrame Player API 无法在 DOMWindow 上执行 postMessage

    我正在尝试使用以下命令将 youtube 加载到我的网页中YouTube iFrame Player API 并在加载时出现以下错误 Failed to execute postMessage on DOMWindow The target
  • 如何调试 Node.js 应用程序?

    如何调试 Node js 服务器应用程序 现在我主要使用警报调试打印语句如下 sys puts sys inspect someVariable 一定有更好的调试方法 我知道谷歌浏览器 http en wikipedia org wiki
  • 如何在 Twilio 可编程聊天中的单个通道上侦听消息

    Using twilio chat js https www npmjs com package twilio chat如何在单个频道上收听消息 我发现这个问题 https stackoverflow com questions 54687
  • 我如何用 javascript/jquery 进行两指拖动?

    我正在尝试创建当有两个手指放在 div 上时拖动 div 的功能 我已将 div 绑定到 touchstart 和 touchmove 事件 我只是不确定如何编写这些函数 就像是if event originalEvent targetTo

随机推荐