Function.length和this.length不一样.为什么

Function.length is not the same as this.length. Why?

本文关键字:length 为什么 不一样 Function this      更新时间:2023-12-03

下面是一个简单的函数,它需要三个agruments。可以通过arguments.callee.lengthmyFunc.length获得预期数量的参数。为什么this.length返回0?thismyFunc不应该引用同一个函数对象吗?我有点困惑:)。

function myFunc(a, b, c){
   console.log(arguments.callee.length, myFunc.length, this.length);
}
myFunc("a","b"); //=> prints 3 3 0

与其他语言相比,函数的this关键字在JavaScript中的表现略有不同。严格模式和非严格模式也有一些区别。在大多数情况下,这个值由函数的调用方式决定。它不能在执行过程中通过赋值进行设置,每次调用函数时可能会有所不同。ES5引入了bind方法来设置函数this的值,而不管它是如何被调用的,ECMAScript 2015引入了其this在词法范围内的箭头函数(它被设置为封闭执行上下文的this值)。【参考】

在您的场景中:this属于我们正在执行的function的所有者,或者属于我们正在调用的方法的object(函数的调用方式)

在您的示例中,myFunc的所有者是windowwindow.myFunc("a","b");),因此是this.length == 0。如果您在控制台中打开window对象,您会发现length属性的值为0


要在调用function时拥有自己的this参数,请使用.callcall()方法调用具有给定this值和单独提供的参数的函数

function myFunc(a, b, c) {
  console.log(arguments.callee.length, myFunc.length, this.length);
}
myFunc.call(myFunc, "a", "b"); //=> prints 3 3 3
<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>