js 函数 允许接收任意个数参数.

<script>
function Fun1(x) {
if (x >0) { return x;}
 else { return -x;}
}
console.log(  Fun1(2)  );
// 输出 2
console.log(  Fun1(-1) );
// 输出 1
</script

x → 自定义. 只要和函数里面对应就可以.

函数的变量 作用域 js 中 var 声明的变量. 只能在函数内部使用. 函数外部无效!!!!

不同的函数 里面的变量都是独立的. 不会影响别的函数.

JavaScript函数可以嵌套: 内部函数可以访问外部函数定义的变量,反过来则不行:

如果内部函数和外部函数的变量名重名怎么办: 从“内”向“外”查找。如果内部函数定义了与外部函数重名的变量,则内部函数的变量将“屏蔽”外部函数的变量。

变量提升 JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部:

所以 声明不一定要写在函数首部..

全局作用域 不在任何函数内定义的变量就具有全局作用域。实际上,JavaScript默认有一个全局对象window,全局作用域的变量实际上被绑定到window的一个属性:

var course = 'Learn JavaScript'; alert(course); // 'Learn JavaScript' alert(window.course); // 'Learn JavaScript' 直接访问全局变量course和访问window.course是完全一样的。

名字空间 全局变量会绑定到window上. 不同的js 文件 如果使用了相同的全局变量. 或者定义了相同名字的顶层函数. 就会造成命名冲突.

减少冲突方法: 把所有变量和函数 全部绑定到一个全局变量中.

// 唯一的全局变量MYAPP:
var MYAPP = {};

// 其他变量:
MYAPP.name = 'myapp';
MYAPP.version = 1.0;

// 其他函数:
MYAPP.foo = function () {
return 'foo';
};

常量 由于var和let申明的是变量,如果要申明一个常量,在ES6之前是不行的,我们通常用全部大写的变量来表示“这是一个常量,不要修改它的值”: var PI = 3.14;


绑定到对象上的函数称为方法,和普通函数也没啥区别,但是它在内部使用了一个this关键字

对象: var xiaoming = { name: ‘小明’, birth: 1990 };

方法:

var xiaoming = {
name: '小明',
birth: 1990,
age: function () {
var y = new Date().getFullYear();
return y - this.birth;
}
};

xiaoming.age; // function xiaoming.age()
xiaoming.age(); // 今年调用是25,明年调用就变成26

this 是一个特殊变量,它始终指向当前对象,也就是xiaoming这个变量。 所以,this.birth可以拿到xiaoming的birth属性。

function getAge() {
var y = new Date().getFullYear();
return y - this.birth;
}

var xiaoming = {
name: '小明',
birth: 1990,
age: getAge
};

xiaoming.age(); // 25, 正常结果
getAge(); // Na

单独调用函数getAge()怎么返回了NaN?请注意,我们已经进入到了JavaScript的一个大坑里。 JavaScript的函数内部如果调用了this,那么这个this到底指向谁? 答案是,视情况而定! 如果以对象的方法形式调用,比如xiaoming.age(),该函数的this指向被调用的对象,也就是xiaoming,这是符合我们预期的。

如果单独调用函数,比如getAge(),此时,该函数的this指向全局对象,也就是window。 坑爹啊! 更坑爹的是,如果这么写: var fn = xiaoming.age; // 先拿到xiaoming的age函数 fn(); // NaN 也是不行的! 要保证this指向正确,必须用obj.xxx()的形式调用!

高阶函数

js 的函数其实都指向某个变量.

函数的参数能接收变量. 函数也是指向变量的 → 函数可以接收另外一个函数作为参数.

function add(x, y, f) { return f(x) + f(y); }

当我们调用add(-5, 6, Math.abs)时,参数x,y和f分别接收-5,6和函数Math.abs,根据函数定义,我们可以推导计算过程为: x = -5; y = 6; f = Math.abs; f(x) + f(y) ==> Math.abs(-5) + Math.abs(6) ==> 11; return 11; 用代码验证一下: add(-5, 6, Math.abs); // 11

<script>
function Fun1(x) {
if (x >0) { return x;}
 else { return -x;}
}
console.log(  Fun1(2)  );
// 输出 2
console.log(  Fun1(-1) );
// 输出 1
</script>

Map 比如我们有一个函数f(x)=x2,要把这个函数作用在一个数组[1, 2, 3, 4, 5, 6, 7, 8, 9]

function pow(x) {
return x * x;
}

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81]

map()作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的f(x)=x2,还可以计算任意复杂的函数,比如,把Array的所有数字转为字符串: var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; arr.map(String); // [‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’]

reduce x1, x2, x3, x4.reduce(f) = f(f(f(x1, x2), x3), x4)

比方说对一个Array求和,就可以用reduce实现: var arr = [1, 3, 5, 7, 9]; arr.reduce(function (x, y) { return x + y; }); // 25

要把1, 3, 5, 7, 9变换成整数13579,reduce()也能派上用场:

var arr = [1, 3, 5, 7, 9];
arr.reduce(function (x, y) {
return x * 10 + y;
}); // 13579