尽管我有多年的 Java 经验,但我还是 js 的新手
我想当我声明一个函数时,它本质上是一种特殊类型的对象,并且有一些可以直接访问的内置字段,例如“参数”和“长度”
我注意到我可以在函数范围内访问诸如“参数”之类的内容 即
function add(a,b) {
return arguments[0]+arguments[1]
}
我还可以访问范围之外的“长度”之类的内容
//2
alert(add.length)
上面的代码片段应该是正确的使用方式
但是
function sum(a,b) {
// error
return length
}
// null
alert(sum.arguments)
我认为参数和长度的基本原理不同,这是正确的想法吗?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~
经过一番研究,我找到了造成困惑的根本原因。 问题围绕 JavaScript 中的属性 VS 变量
属性属于对象,变量属于上下文。 这两个想法有时可以互换: 全局上下文恰好是 window
<script>
//property
window.foo="a"
//variable
var bar="b"
//a
alert(foo)
//b
alert(bar)
</script>
在大多数情况下,例如函数上下文,它们是完全不同的想法,部分原因是您永远无法在代码中访问函数对象。因此,与全局设置相反,分配属性是不可能的!可能的只是在范围内声明一个变量
在我的问题中 “参数”是一个变量 而“长度”是一个属性 我没能区分这两者
更多信息请参阅 this post
最佳答案
函数是 JavaScript 中的对象。正确的、真实的物体。
长度
函数的 length
属性是它所声明的参数的数量(这也称为函数的“arity”)。 add
的元数(length
)为 2,因为您为其声明了两个形式参数:a
和 b
。
参数
arguments
伪数组不是函数对象的一部分。它是在调用函数时创建的对象,并且仅在该函数调用上下文的范围内。它包含函数调用时实际使用的所有参数,这些参数可能与其声明的参数数量不同。对函数的每个单独调用都会获得自己单独的arguments
对象。
在 JavaScript 的“松散模式”(2009 年 ECMAScript 第 5 版规范之前的唯一模式)中,arguments
伪数组和声明的参数之间存在实时连接:
// In loose mode only
function foo(a) {
console.log("a = " + a);
console.log("arguments[0] = " + arguments[0]);
a = 42;
console.log("a = " + a);
console.log("arguments[0] = " + arguments[0]);
}
foo(67);
在松散模式下,输出:
a = 67 arguments[0] = 67 a = 42 arguments[0] = 42
在“严格”模式(这是首选使用模式)下,该链接不存在(我们会在末尾看到 arguments[0] = 67
),这很有用用于 JavaScript 引擎以进行优化。
关于JavaScript 函数长度和参数属性/字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32296106/