JS---call apply bind的区别&&JS---argument

参考学习:http://www.cnblogs.com/pssp/p/5215621.html
https://www.cnblogs.com/ly0612/p/6821124.html
1.call apply bind
javaScript权威指南上的解释是:
call() 、apply()可以看作是某个对象的方法,通过调用方法的形式来间接调用函数。bind() 就是将某个函数绑定到某个对象上。

call() apply() bind()相同点:都可以改变this的指向。
call() 和apply()的第一个参数相同,就是指定的对象。这个对象就是该函数的执行上下文。
call()和apply()的区别就在于,两者之间的参数。
call()在第一个参数之后的 后续所有参数就是传入该函数的值。apply() 只有两个参数,第一个是对象,第二个是数组,这个数组就是该函数的参数。

bind() 方法和前两者不同在于: bind() 方法会返回执行上下文被改变的函数而不会立即执行,而前两者是直接执行该函数。他的参数和call()相同。

2.argument
说明:
 Javascrip中每个函数都会有一个Arguments对象实例arguments,它引用着函数的实参,可以用数组下标的方式"[]"引用arguments的元素。arguments.length为函数实参个数,arguments.callee引用函数自身。
属性:

length, 获取arguments对象的长度(实参)。   
callee, 引用当前正在执行的函数。

1.可以借用arguments.length可以来查看实参和形参的个数是否一致:

function add(a, b) {
  var realLen = arguments.length;
  console.log("realLen:", arguments.length);
  var len = add.length;
  console.log("len:", add.length);
  if (realLen == len) {
  	console.log('实参和形参个数一致');
  } else {
  	console.log('实参和形参个数不一致');
  }
};
add(1,2,3,6,8);

2.可以借用arguments.callee来让匿名函数实现递归:

var sum = function(n) {
	if(n == 1) {
		return 1;
  } else {
  	return n + arguments.callee(n-1);
 }
}
console.log("sum =", sum(5));
原文地址:https://www.cnblogs.com/princeness/p/11664969.html