对js里function的length属性的理解

8 篇文章 0 订阅

相信大家对数组里的length属性应该不陌生,它表示数组元素的个数,但是你有没有留意过,function里也有一个length属性,下面是我对该属性的一点理解,希望对大家有所帮助。

function的length属性(指实例对象/已定义的函数)

它表示该函数的形参个数,我们来看一下下面的例子

function fn(a, b, c) {
	return a + b + c;
}
console.log(fn.length);    // 输出3

那么这个length属性哪来的呢?
因为function它是一个对象,所以这个length属性可以往它的原型找

function原型的length属性

根据原型链往上找

console.log(fn.__proto__.length);  // 输出0

因为函数的形参个数是定义函数时才定的,所以function的原型length值理所当然的为0

function构造器的length属性

再打印一下Funtion的length属性康康

console.log(Function.length);   // 输出1
console.log(fn.__proto__.constructor.length);  // 同样输出1

至于这里的length为什么是1呢?
在这我需要解释一下:
Function这个构造器本身也是一个函数,它接受至少一个参数,这个参数便是定义函数后的函数体
比如说:

var fn = new Function('return 1+2+3');  // 注意参数类型必须为字符串形式
// 等同于
function fn() {
	return 1+2+3;
}
// 带参数的函数写法
var fn = new Function('a', 'b', 'c', 'console.log("我是函数体");return a+b+c');  // 函数体语句之间用分号隔开
// 等同于
function fn(a, b, c) {
	return a + b + c;
}

但是!请注意,这种写法并不支持闭包哦
例如:

var i = 1;
+function(a, b, c) {
	var j = 2;
	var fn = new Function('a', 'b', 'c', 'console.log(i);console.log(j);console.log(a+b+c)');
	fn(a, b, c);
}(1, 2, 3);    // 此时函数只能访问全局的 i,无法访问内部的 j

使用Function构造器生成的函数,并不会在创建它们的上下文中创建闭包;它们一般在全局作用域中被创建。当运行这些函数的时候,它们只能访问自己的本地变量和全局变量,不能访问Function构造器被调用生成的上下文的作用域

害,扯远了。换台换台!!
再首尾呼应一下:因为构造器Function接受至少一个参数(作为无参函数的函数体),所以它的length打印出来的结果就是 1 啦

function的arguments的length属性

写到这里有必要区别一下另外一个东西,那就是 arguments
它表示函数传入实际参数的个数,注意哦是实参个数

来人!上祖传栗子!!

fn(1, 2, 3);

function fn(a, b, c) {
	console.log(arguments.length);  // 输出3
	console.log(fn.length);  // 输出3
	return a + b + c;
}

有小同学可能要举手了,“欸,老师!这俩不一样么???”
“当然不一样啦”(推眼镜)
“来人!!再上一颗金牌栗子!!”

fn(1, 2);

function fn(a, b, c) {
	console.log(arguments.length);  // 输出2
	console.log(fn.length);  // 输出3
	return a + b + c;
}

小同学s:“哦~~~秒懂!”
以上就是本文所有内容,感谢大家捧场~

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值