function foo(){}
delete foo.length;
alert(typeof foo.length);
// result is number
为什么以上代码提醒号码?这是一个错误吗?
-Nick
谢谢!
答案 0 :(得分:1)
一个函数对象有一个名为.length
的内置属性,它指定使用该函数定义的参数数量,这是您无法删除或更改其值的函数。
答案 1 :(得分:1)
length
属性指定函数预期的参数数量。它有property attributes Writable: false, Enumerable: false, Configurable: true
。所以你不能删除它。它总是返回一个数字。
答案 2 :(得分:0)
实际上,它比你的例子所展示的更奇怪。
使用此代码似乎,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++;
但是上述两行都会在严格模式下引发异常:
TypeError:无法分配给函数'function foo(a,b,c)的只读属性'length'{}'
但delete foo.length
也适用于严格模式,始终将foo.length
更改为零。
答案 3 :(得分:0)
delete foo.length
不起作用,因为函数原型中仍然存在长度,并且长度为0。
要更改函数的长度或名称,可以将其重新定义为可写的。
Object.defineProperty(foo, 'length', { writable: true, configurable: true });
现在您可以更改长度。
请记住,如果删除长度,则函数原型中的长度仍然为0。 您可以根据需要进行更改:
Object.setPrototypeOf(foo, {});
该功能仍然可用。