js 函数的参数 问题 arguments对象 及闭包
2015-06-27 23:35
816 查看
js 参数的传递 是按值传递,在函数内部对变量所做的操作,不会影响到外部的变量。但是如果传递的是复合类型的对象,在内部对其属性所做的操作,则会影响外部对象,这是按址传递。
例如
如果想要对按值传递的参数在函数内部对其所做的操作影响到外部变量,可以将其写成全局对象的属性
例如
如果定义函数时候,参数名字全部取相同的名字,而函数内部取值的时候以最后一个为准,哪怕,最后一个都没有传递进来
例如
如果想获取同名参数的第一个怎么办?可以借助arguments对象来实现 ,因为js允许不定数量的参数,所以需要在函数内部读取所有参数,那么arguments对象就应运而生,并且只能在函数内部使用。
console.log(arguments[0]);
除了读取参数外,能为参数进行赋值吗?答案是可以的,不过一般不建议这么做,没有意义,实参本来就是想传进来的值,干嘛还要更改其值那?
还可以通过arguments对象的length属性查看函数调用时候传递几个参数,可以跟函数的length做个比较,函数的length属性查看声明是声明了几个参数,arguments队形的length属性则可以查看传参时候实际传几个参数进来
例如
arguments对象还有一个属性callee,将返回它对应的原函数
闭包(closure)就是定义在函数体内部的函数。更理论性的表达是,闭包是函数与其生成时所在的作用域对象(scope object)的一种结合。
上面的代码中,c是定义在函数f内部的函数,就是闭包。
闭包的特点在于,在函数外部可以读取函数的内部变量。
上面代码表示,原先在函数f外部,我们是没有办法读取内部变量v的。但是,借助闭包c,可以读到这个变量。
闭包不仅可以读取函数内部变量,还可以使得内部变量记住上一次调用时的运算结果。
上面代码表示,函数内部的start变量,每一次调用时都是在上一次调用时的值的基础上进行计算的。
关于js的apply()和call()方法用法的文章 请查阅http://blog.csdn.net/business122/article/details/8000676
例如
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
相关文章推荐
- JavaScript语法 (顺序+判断+选择+循环+其他=五种语句)演示
- Web 开发的 JavaScript 框架资料收集(15款)
- 谈谈Ext JS的组件——布局的使用方法续二
- 谈谈Ext JS的组件――布局的使用方法续二
- 谈谈Ext JS的组件——布局的使用方法续二
- 谈谈Ext JS的组件——布局的使用方法续二
- 谈谈Ext JS的组件——布局的使用方法续二
- Js取数组中最大值和最小值
- JS~字符串长度判断,超出进行自动截取(支持中文)
- 纯JS实现房贷利率报表对比
- js——事件
- javascript运动的小Tip。
- js防刷新的倒计时
- JavaScript Date对象
- javascript代码实用方法实现
- JavaScript创建对象的几种方式
- JS中将控制台log输出显示到浏览器中
- [extjs] ExtJS 4.2 开发环境搭建
- js for循环绑定问题解决
- HTML5系列四(特征检测、Modernizr.js的相关介绍)