JavaScript高级程序设计(第3版)学习笔记8 js函数(中)主要围绕函数作用域、闭包、函数式编程和函数对象四大主题展开,下面分别做详细说明:
函数作用域
JavaScript中的函数作用域是通过函数定义时的位置来决定的,即内部函数可以访问外部函数中的变量和函数,而外部函数无法访问内部函数中的变量。通过这种作用域链的形式来维护作用域,每个函数被创建时都会自动创建一个内部属性Scope,其中保存了当前的作用域链。该作用域链是一个指针列表,每个指针指向一个变量对象(VO)或者全局对象(GO),作为当前代码的可执行环境。而函数中定义的变量会保存在函数执行环境(Activation Object)中。函数执行完毕后,它的执行环境会被销毁,内部定义的变量也就随之消失。
闭包
闭包是指有权访问另外一个函数作用域中的变量的函数,即使这个函数已经被执行完毕,也仍然可以使用其中的变量。闭包的实现方式是在外部函数中定义内部函数,并且内部函数中可以使用外部函数中的变量,从而形成一个闭包。在编程中,闭包常常用于封装变量和对象,以防止全局命名冲突,另外还可以用于事件处理器和回调函数等场景中使用。
下面是一个使用闭包实现计数器的示例:
function counter() {
var count = 0;
return function() {
return ++count;
};
}
var c1 = counter();
console.log(c1()); // 1
console.log(c1()); // 2
函数式编程
函数式编程(Functional Programming)是一种基于数学函数的编程风格,它强调使用纯函数(Pure Function)、函数组合和函数传递等概念。纯函数指的是输入相同的参数时,总是返回相同的结果,不会对外部环境产生任何副作用的函数。函数组合指的是将多个函数结合在一起,构成一个更加复杂的函数。而函数传递则是指将一个函数作为参数,传递给另外一个函数。
在JavaScript中,函数式编程可以借助于函数的高阶特性实现。常用的高阶函数包括map()、reduce()和filter()等。map()函数可以将一个数组映射成另外一个数组,reduce()函数可以将一个数组合并成一个值,filter()函数可以对一个数组进行筛选。
下面是一个使用map()和reduce()实现计算平均值的示例:
var numbers = [1, 2, 3, 4, 5];
var sum = numbers.reduce(function(prev, cur) {
return prev + cur;
});
var avg = sum / numbers.length;
console.log(avg); // 3
函数对象
JavaScript中的函数也是一种对象(Function Object),它具有方法和属性。常用的函数对象方法包括call()、apply()和bind()等,这些方法都可以用来改变this关键字的指向,从而达到使用不同对象调用同一个函数的目的。
下面是一个使用call()方法实现继承的示例:
function Animal(name) {
this.name = name;
}
Animal.prototype.sayName = function() {
console.log(this.name);
};
function Dog(name, age) {
Animal.call(this, name);
this.age = age;
}
var dog = new Dog("旺财", 3);
dog.sayName(); // 报错,因为Dog没有继承Animal的原型
// 结合使用call()和Object.create()方法来实现继承
Dog.prototype = Object.create(Animal.prototype, {
constructor: {
value: Dog,
enumerable: false,
writable: true,
configurable: true
}
});
dog.sayName(); // 旺财
以上是JavaScript高级程序设计(第3版)学习笔记8 js函数(中)的完整攻略,希望对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript高级程序设计(第3版)学习笔记8 js函数(中) - Python技术站