关于javascript中函数概念的总结
- [ 一 ] 函数的2中表达方式
-
仅作函数声明,加载时会被提升
function sum(x) {
if(x>0)
return ‘正数’;
else
return '负数’;
} -
匿名函数表达式赋值给变量,会立即执行,后面带分号
var sum = function (){
if(x>0)
return ‘正数’;
else
return '负数’;
}; -
函数的传参多少都没有语法错误,要避免收到undefined,需对参数检查
function sum(x) {
if(typeof x != ‘number’)
throw ‘not a number’;
…
} -
函数中的关键字arguments,她永远指向函数调用者传入的所有参数。
function foo(x) {
console.log('x = ’ + x); // 10
for (var i=0; i<arguments.length; i++) {
console.log('arg ’ + i + ’ = ’ + arguments[i]); // 10, 20, 30
}
}
foo(10, 20, 30);
- [ 二 ] 函数中变量的声明 : var 所在函数为该变量的作用域,
注意: 1 函数之间的变量相互独立,互不影响,嵌套函数就近原 则。
2 函数中的变量声明会提升,但是赋值不会提升。
3 不在函数中定义的变量成为全局变量,js中默认全局对象window,全局变量就是绑定到window的属性。
4 名字空间可以处理不同js文件使用相同全局变量引起的命名冲突,
5 块级作用域变量 let ,常量定义 const
6 解构赋值。*(不用循环取值,简化代码)var [x, y, z] = [‘hello’, ‘JavaScript’, ‘ES6’]; - [ 三] 函数中this的问题
函数内的this一般指向当前对象,外部引用会重新指向undefined 或window; 可以用apply或call控制this指向。
函数本身的apply方法,两个参数(this对象,[传参]) - [ 四 ] 高阶函数可以将函数作为参数传入,或者将函数作为结果返回
*闭包 :在函数嵌套时,内部函数可以引用外部函数的参数和局部变量,当外部函数返回内部函数时,相关参数 和变量便被保存在函数当中。
闭包就是携带状态的函数,并且它的状态可以完全对外隐藏起来。
例:function lazy_sum(arr) {
var sum = function () {
return arr.reduce(function (x, y) {
return x + y;
});
}
return sum;
}
var f = lazy_sum([1, 2, 3, 4, 5]); //返回的是求和函数而不是结果 ;而且这里每次调用都是返回新的函数。
f(); // 15 调用函数
返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量