命名为字符串的参数在 Javascript 中如何工作?

How do parameters named as strings work in Javascript?

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

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

我理解这如何有助于缩小,例如 Angular(必须匹配来自另一个文件的 arg 名称,如 $scope),但这是原生的 Javascript .这是如何工作的'behind the scenes'(例如,JS 解释器是否分析字符串并将其替换为实际参数)?

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

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

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

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

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

如何传递参数

假设您定义一个函数如下

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 确定不会被某些浏览器的内部机制绊倒。

参数名称是否匹配

绝对不是。函数参数列表中的内容完全独立于与其他代码的任何交互,但是当您维护代码库时,您希望代码可读且一致。这是约定的问题,不是语言强制执行的。