JS学习——函数
学习内容来源:JavaScript 函数参数、JavaScript 函数调用、JavaScript 闭包
JavaScript 函数参数
注意:JavaScript 函数不会对参数值进行任何检查。
函数参数
- 函数参数(parameter)指的是在函数定义中列出的名称。
- 函数参数(argument)指的是传递到函数或由函数接收到的真实值。
参数规则
- JavaScript 函数定义不会为参数(parameter)规定数据类型。
- JavaScript 函数不会对所传递的参数(argument)实行类型检查。
- JavaScript 函数不会检查所接收参数(argument)的数量。
参数默认
如果调用参数时省略了参数(少于被声明的数量),则丢失的值被设置为:undefined。
注意:有时这是可以接受的,但是有时最好给参数指定默认值。
arguments 对象
如果函数调用的参数太多(超过声明),则可以使用 arguments 对象来达到这些参数。
arguments 对象包含函数调用时使用的参数数组。
例子:
// 计算所有数的和,x = 871
x = sumAll(1, 123, 500, 115, 44, 88);
function sumAll() {
var i, sum = 0;
for (i = 0; i < arguments.length; i++) {
sum += arguments[i];
}
return sum;
}
参数通过值传递
函数调用中的参数(parameter)是函数的参数(argument)。
JavaScript 参数通过值传递:函数只知道值,而不是参数的位置。如果函数改变了参数的值,它不会改变参数的原始值。
注意:参数的改变在函数之外是不可见的。
对象是由引用传递的
在 JavaScript 中,对象引用是值。
正因如此,对象的行为就像它们通过引用来传递。如果函数改变了对象属性,它也改变了原始值。
注意:对象属性的改变在函数之外是可见的。
JavaScript 函数调用
以函数形式调用函数
这种函数不属于任何对象。但是在 JavaScript 中,始终存在一种默认的全局对象。
在 HTML 中,默认全局对象是 HTML 页面本身,所有上面的函数“属于”HTML 页面。
在浏览器中,这个页面对象就是浏览器窗口。上面的函数自动成为一个窗口函数。
function myFunction(a, b) {
return a * b;
}
myFunction(10, 2); // 将返回 20
// myFunction() 和 window.myFunction() 是同一个函数:
function myFunction(a, b) {
return a * b;
}
window.myFunction(10, 2); // 也会返回 20
作为方法来调用函数
fullName 方法是一个函数。该函数属于对象。myObject 是函数的拥有者。
被称为 this 的事物,是“拥有”这段 JavaScript 代码的对象。在此例中,this 的值是 myObject。
var myObject = {
firstName:"Bill",
lastName: "Gates",
fullName: function () {
return this.firstName + " " + this.lastName;
}
}
myObject.fullName(); // 将返回 "Bill Gates"
通过函数构造器来调用函数
构造器调用会创建新对象。新对象会从其构造器继承属性和方法。
构造器内的 this 关键词没有值。
this 的值会成为调用函数时创建的新对象。
// 这是函数构造器:
function myFunction(arg1, arg2) {
this.firstName = arg1;
this.lastName = arg2;
}
// 创建了一个新对象:
var x = new myFunction("Bill", "Gates");
x.firstName; // 会返回 "Bill"
JavaScript 闭包
JavaScript 变量属于本地或全局作用域。
全局变量能够通过闭包实现局部(私有)。
JavaScript 嵌套函数
所有函数都有权访问全局作用域。
事实上,在 JavaScript 中,所有函数都有权访问它们“上面”的作用域。
JavaScript 支持嵌套函数。嵌套函数可以访问其上的作用域。
闭包指的是有权访问父作用域的函数,即使在父函数关闭之后。
例子:
function add() {
var counter = 0;
function plus() {counter += 1;}
plus();
return counter;
}
如果我们能够从外面访问 plus() 函数。
我们还需要找到只执行一次 counter = 0 的方法。
我们需要闭包(closure)。
// counter = 3
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
add();
add();
add();
变量 add 的赋值是自调用函数的返回值。
这个自调用函数只运行一次。它设置计数器为零(0),并返回函数表达式。
这样 add 成为了函数。最“精彩的”部分是它能够访问父作用域中的计数器。
这被称为 JavaScript 闭包。它使函数拥有“私有”变量成为可能。
计数器被这个匿名函数的作用域保护,并且只能使用 add 函数来修改。