调用时实际传递的参数可以比定义的参数多或者少,见下面的两个例子
<script> function test(a,b,c){JS的方法没有"重载"的概念,后定义的方法会覆盖前面的定义,如下面的例子,
console.log(a);
}
test('a');
test('a','b','c');
</script>
<script>
function test(a){
console.log(a);
}
test('a');
test('a','b','c');
</script>
都会执行第二个test方法。
<script> function test(a){ console.log(a); } function test(a,b){ console.log('next definition'); console.log(a); } test('a'); test('a','b','c');</script>JS方法有一个内置的参数 arguments,这是很多JS框架"赖以生存”的基础,
如下面的例子:
<script> function test(){ console.log(arguments); var arg = arguments[0]; if(arg.val1){ console.log(arg.val1); } if(arg.val2){ console.log(arg.val2); } } test('a'); test('a','b','c'); test({val1:'value1'});</script>
call, apply作用就是"借用"别人的方法来调用,就像调用自己的一样.
call, apply方法区别是,从第二个参数起, call方法参数将依次传递给借用的方法作参数, 而apply直接将这些参数放到一个数组中再传递, 最后借用方法的参数列表是一样的.
下面的例子可以理解为 obj 有一个test方法,被obj1和obj2"借用"了
<script> var obj = { test: function(){ console.log(this.name); } } var obj1 = {name:'object1 name'}; obj.test.call(obj1); console.log('--------'); var obj2 = {name:'object2 name'}; obj.test.apply(obj2);</script>