您的位置:首页 > Web前端 > JavaScript

js 函数的参数 问题 arguments对象 及闭包

2015-06-27 23:35 816 查看
js 参数的传递 是按值传递,在函数内部对变量所做的操作,不会影响到外部的变量。但是如果传递的是复合类型的对象,在内部对其属性所做的操作,则会影响外部对象,这是按址传递。

例如

var a = [1,2,3];

function f(a){
a[0]=4;
}

f(a);
// 结果[4,2,3]
alert(a);


如果想要对按值传递的参数在函数内部对其所做的操作影响到外部变量,可以将其写成全局对象的属性

例如

var a = 1;

function f(p){
window[p]=2;
}

f('a');

a // 2


如果定义函数时候,参数名字全部取相同的名字,而函数内部取值的时候以最后一个为准,哪怕,最后一个都没有传递进来

例如

function f(a, a){
console.log(a);
}

f(1,2)
// 2
f(1)
//undefined


如果想获取同名参数的第一个怎么办?可以借助arguments对象来实现 ,因为js允许不定数量的参数,所以需要在函数内部读取所有参数,那么arguments对象就应运而生,并且只能在函数内部使用。

console.log(arguments[0]);

除了读取参数外,能为参数进行赋值吗?答案是可以的,不过一般不建议这么做,没有意义,实参本来就是想传进来的值,干嘛还要更改其值那?

还可以通过arguments对象的length属性查看函数调用时候传递几个参数,可以跟函数的length做个比较,函数的length属性查看声明是声明了几个参数,arguments队形的length属性则可以查看传参时候实际传几个参数进来

例如

function f(a, b){
arguments[0]=2;
arguments[1]=3;
console.log(arguments.length);
}
f(1,2,3); //3
f(1);     //1
f();     //0
console.log(f.length); // 2


arguments对象还有一个属性callee,将返回它对应的原函数
arguments.<span style="color: rgb(255, 0, 0);">callee </span>// f


闭包(closure)就是定义在函数体内部的函数。更理论性的表达是,闭包是函数与其生成时所在的作用域对象(scope object)的一种结合。

function f() {
var c = function (){};
}


上面的代码中,c是定义在函数f内部的函数,就是闭包。

闭包的特点在于,在函数外部可以读取函数的内部变量。

function f() {
var v = 1;
var c = function (){
return v;
};
return c;
}
var o = f();
o();
// 1


上面代码表示,原先在函数f外部,我们是没有办法读取内部变量v的。但是,借助闭包c,可以读到这个变量。

闭包不仅可以读取函数内部变量,还可以使得内部变量记住上一次调用时的运算结果。

function createIncrementor(start) {
return function () {
return start++;
}
}
var inc = createIncrementor(5);
inc() // 5
inc() // 6
inc() // 7


上面代码表示,函数内部的start变量,每一次调用时都是在上一次调用时的值的基础上进行计算的。
关于js的apply()和call()方法用法的文章 请查阅http://blog.csdn.net/business122/article/details/8000676
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: