Function.length和this.length不一样.为什么
Function.length is not the same as this.length. Why?
下面是一个简单的函数,它需要三个agruments。可以通过arguments.callee.length
或myFunc.length
获得预期数量的参数。为什么this.length
返回0?this
和myFunc
不应该引用同一个函数对象吗?我有点困惑:)。
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
的所有者是window
(window.myFunc("a","b");
),因此是this.length == 0
。如果您在控制台中打开window
对象,您会发现length
属性的值为0
。
要在调用function
时拥有自己的this
参数,请使用.call
,call()
方法调用具有给定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>
相关文章:
- 为什么Float32Array.length的值总是3
- JQuery `length`属性工作不正常.为什么?
- 为什么 .length 在此代码中总是返回 0
- 有时 array.length 只在 .push() 之后工作(为什么?)
- Function.length和this.length不一样.为什么
- 为什么 Array.Length = 1 当空数组通过 ajax 传递给函数时
- 为什么计数是(':checked')或 prop('checked') 单选按钮由 .length 返回未定义
- 为什么 JSONObject.length 未定义
- 为什么在我的 SVG 中说 .selectAll() D3 创建的圆圈是使用 .length 的 1 个元素
- 为什么我的 array.length 返回这么高的数字
- 为什么第一页的history.length是2
- 为什么在Javascript中.length之后没有()
- 为什么在JavaScript中调用“fn.length”会返回“fn”具有的命名参数数
- 谁能解释为什么我得到这个错误在Javascript?[无法读取属性'length'未定义)
- 为什么在D. Flanagan's ' JS:权威指南"需要arguments.length
- 为什么ko.observableArray.length不返回底层数组的长度?
- 为什么.length不是一个需要()的方法
- 为什么array[length]返回列表的第一个元素?
- 哪些对象在JavaScript有一个.length属性?(又名为什么下划线_.每个都把我的函数对象当作数组?)
- 有人能解释为什么array.length会在这里返回两个不同的结果吗