使用 delete 运算符删除空函数中的 .length
use delete operator to delete .length in an empty function
function foo(){}
delete foo.length;
alert(typeof foo.length);
// result is number
为什么是上面的代码警报号码?这是一个错误吗?
-缺口
谢谢!
函数对象具有一个名为 .length
的内置属性,该属性指定使用函数定义的参数数,这是您无法删除或更改其值的内容。
length
属性指定函数所需的参数数。它有property attributes Writable: false, Enumerable: false, Configurable: true
.所以你不能删除它。它始终返回一个数字。
> 2018 更新
实际上,它比您的示例所展示的更奇怪。
使用此代码似乎无法更改foo.length
:
function foo() {}
alert(foo.length); // alerts 0
delete foo.length;
alert(typeof foo.length); // alerts 'number'
alert(foo.length); // alerts 0
但这更有趣:
function foo(a, b, c) {}
alert(foo.length); // alerts 3
delete foo.length;
alert(typeof foo.length); // alerts 'number'
alert(foo.length); // alerts 0
因此,并不是您的delete foo.length
不会更改值 - 它确实会更改,而是将其更改为 0!
值得注意的是,这在非严格模式下没有效果:
foo.length = 0;
foo.length++;
但是上述两行都会在严格模式下引发异常:
类型错误:无法将函数"函数 foo(a, b, c( {}" 的只读属性"长度"分配给只读属性
但delete foo.length
在严格模式下也有效,总是将foo.length
更改为零。
delete foo.length
不起作用,因为长度仍然存在于函数原型中并且为 0。
要更改函数长度或名称,可以将其重新定义为可写。
Object.defineProperty(foo, 'length', { writable: true, configurable: true });
现在您可以更改长度。
请记住,如果您删除长度,则函数原型中仍为 0。如果需要,可以更改它:
Object.setPrototypeOf(foo, {});
功能仍然可用。
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 如何在JavaScript中将字符串转换为函数引用
- 用嵌套函数和默认函数定义函数
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- JQuery合并了keyup和focusout两个函数
- 使用 delete 运算符删除空函数中的 .length
- 为什么 Array.Length = 1 当空数组通过 ajax 传递给函数时
- 如何将 ** return (this.innerText.length <= 200) ** 移动到函数
- javascript array.length 函数的奇怪结果
- 如何定义javascript字符串.length()函数
- jQuery - .length返回“数字”不是一个函数
- 包装函数和function.length
- 被'函数',Function.length是Function或Function.prototype的属性
- 哪些对象在JavaScript有一个.length属性?(又名为什么下划线_.每个都把我的函数对象当作数组?)
- 函数的length属性
- 如何重写函数.Length在严格模式下返回数组的长度
- 如何为table.rows.length函数排除html表中的标题行.Java脚本中的