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

时间:2015-11-21 17:28:09

标签: javascript function parameters

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

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

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

Stackoverflow的第一天,如果这是一个重复的问题,请道歉:)

2 个答案:

答案 0 :(得分: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确保您不会错过某些浏览器的内部机制。

参数名称是否匹配

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

答案 1 :(得分:0)

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

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

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

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