【问题标题】:How do parameters named as strings work in Javascript?命名为字符串的参数如何在 Javascript 中工作?
【发布时间】:2015-11-21 17:28:08
【问题描述】:

Javascript 如何将参数作为字符串工作,为什么这样做?例如:

window.addEventListener('hashchange', function () {

我了解这如何有助于缩小,例如,Angular(它必须与另一个文件中的 $scope 之类的 arg 名称匹配)但这是本机 Javascript。这在“幕后”是如何工作的(例如,JS 解释器是否分析字符串并将它们替换为实际参数)?

在 Stackoverflow 上的第一天,如果这是一个重复的问题,我们深表歉意 :)

【问题讨论】:

  • Javascript 是一门有趣的语言!但事实上,了解这些东西真的很有帮助
  • 那是因为它是一种松散类型的语言。它在设置参数或变量时不查找类型。 :)
  • 这样做是为了简化并使其更人性化。例如,您没有在孩子出生之前将孩子的类型设置为男性或女性。你只有在它出生后才知道。这就是 Javascript 与您执行 int a = 10; 的任何其他语言不同的方式。在 javascript 中,你总是做 var a 并在需要时分配值,可能是 10 或 "10" 或 true/false 或 {} 或 []
  • 您对addEventListener() 的工作原理、第一个参数的含义或AngularJS 的依赖注入(解析参数名称$scope 以注入正确的引用)如何工作有疑问吗?
  • 它是关于我作为字符串传递的参数如何在 javascript 中工作的。 addEventListener() 是作为示例给出的,并且提到了 AngularJS 来对比它如何使用字符串来保存参数名称。

标签: javascript function parameters


【解决方案1】:

参数是如何传递的

假设你定义一个函数如下

function Foo(argument1, argument2, argument3) {
    return argument1 + argument2
}

当函数被调用时,参数被分别赋值为传递,用undefined 代替任何缺少的。出于说明目的,您可以将其想象为以下代码(尽管它不会真正发生在任何地方,并且您拥有的任何表达式都将在调用范围内进行评估)。

// somewhere in the script
foo('bar', 'baz' + '1')
...
// in scope of function Foo, between its { and }
var argument1 = 'bar', // these lines never actually exist
    argument2 = 'baz1', // but variables are created as if they were
    argument3 = undefined
return argument1 + argument2

脚本引擎如何实际处理这种情况是一个实现细节,您不必担心。

此外,使用文字字符串或传递具有字符串的变量都没有关系。

var a = 'like this', b = 'and this'
foo('like this', 'and this')
foo(a, b) // the function has no way to differentiate these 2 lines

附带说明,这是非常安全的,因为字符串是不可变的。在函数内部分配给它们不会传播回外部范围(即使它们是String 对象)。使用 JavaScript 传递字符串实际上与传递整数相同。

为什么要使用字符串作为参数

在几种情况下,这种设计决策是有意义的。对于addEventListener,它很有用,因为您可以轻松地使your own events 确保不会绊倒某些浏览器的内部机制。

参数名称是否匹配

绝对不是。函数参数列表中的内容与与其他代码的任何交互完全隔离,但是当您维护代码库时,您希望代码具有可读性和一致性。这是协议问题,而不是语言强制执行的问题。

【讨论】:

  • 就是这样吗?那么参数真的被视为字符串吗?也就是说,要检查它是什么类型的 even listener,eventListener 的实现会包含这样的内容:if (type == 'hashChange')。我的印象是一些高级巫术正在发生,而不是简单的字符串文字。
  • 另外,如果是这样,为什么不使用enum 之类的东西来选择事件类型?在我自己的代码中,使用字符串作为“选择器”似乎总是很糟糕。
  • @Warrshrike 函数参数未经过 类型检查。如果算法对类型敏感,您必须自己检查。您的问题并没有真正涉及到这一点,但从语言的角度来看,传递整数、浮点数、字符串、数组或对象是完全有效的,并且它们未经修改地出现在函数中。
【解决方案2】:

addEventListener 方法中的第一个参数用于指定事件处理程序的类型,如“click”或“mousedown”。

在内部,它附加了一个对象(事件处理程序),用于侦听传入事件以处理它们或响应该特定事件。这些事件是由于与 Web 应用程序的交互而触发的,例如用户单击了一个按钮。

对于 AngularJS,它遵循 MVC(模型-视图-控制器)软件架构模式:https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller,因此 $scope 是模型和视图之间的粘合剂。

在 AngularJS 中,它用于访问数据模型。 AngularJS 中的数据模型具有与文档对象相同的功能,但优势在于您可以定义不同的范围级别来访问 DOM。

【讨论】:

  • 我很好奇为什么 JavaScript 使用这种使用字符串的模式来确定事件处理程序类型(我假设函数内部存在类似 if (eventType == 'hashChange') 的东西)。我还没有真正看到它在其他任何地方使用过。例如,Java 框架往往对事件处理程序类型有不同的方法,一些库有enums
猜你喜欢
  • 2011-03-10
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 2021-05-23
相关资源
最近更新 更多