标签:
函数的声明关键字是function,一个函数是有关键字、函数名、参数(实际参数,形式参数)、和返回值构成。
函数类型
声明式函数:函数就是使用 function 命令命名的代码区块,便于反复调用。 function 命令后面是函数名,函数名后面是一对圆括号,里面是传入函数的参数。函
数体放在大括号里面。
// 函数的声明
function test() {
// 方法体
}
表达式函数:除了用 function 命令声明函数,还可以采用变量赋值的写法。
// 函数表达式
var test = function() {
// 方法体
}
Function 构造函数:通过 Function 构造函数声明。用得少
var add = new Function("x", "y", "return x + y");
console.log(add(1, 2));
函数的重复声明
如果多次采用 function 命令,重复声明同一个函数,则后面的声明会覆盖前面的声明。
function f(){
console.log(1);
}
f(); // 2
function f(){
console.log(2);
}
f(); // 2
形式参数和retrun
调用函数时,要使用圆括号运算符。圆括号之中,可以加入函数的参数。
function add(x,y) {
return x+y;
}
add(1,1) // 2
立即函数
有时,我们需要在定义函数之后,立即调用该函数。这时,你不能在函数的定义之后加上圆括号,这会产生语法错误。产生这个错误的原因
是, Javascript 引擎看到 function 关键字之后,认为后面跟的是函数定义语句,不应该以圆括号结尾。
function(){ /* code */ }();
一等公民
avaScript 的函数与其他数据类型处于同等地位,可以使用其他数据类型的地方就能使用函数。比如,可以把函数赋值给变量和对象的属性,也可以当作参数传入其他函数,或者作为函数的结果返回。这表示函数与其他数据类型的地方是平等,所以又称函数为第一等公民。
function add(x, y) {
return x + y;
}
// 将函数赋值给一个变量
var fn = add;
console.log(fn(1, 2));
// 将函数作为参数和返回值
function operator(fn) {
return fn;
}
console.log(operator(add)(1, 2));
函数名的提升(变量提升)
将函数名视同变量名,所以采用 function 命令声明函数时,整个函数会被提升到代码头部。(下面这个代码会报错)
var sum = add(1, 2);
console.log(sum);
var add = function (x, y) {
return x + y;
}
//Uncaught TypeError: add is not a function
代码好像在声明之前就调用了函数 add 。但是实际上,由于 “ 变量提升 ” ,函数 f 被提升到了代码头部,也就是在调用之
前已经声明了。
报错的
ar sum = add(1, 2);
console.log(sum);
var add = function (x, y) {
return x + y;
}
//Uncaught TypeError: add is not a function
同时声明:
如果同时采用 function 命令和赋值语句声明同一个函数,最后总是采用赋值语句的定义。
var fn = function() {
console.log ("1");
};
function fn() {
console.log("2");
}
fn();
// 1
1、name 属性 : 返回紧跟在 function 关键字之后的那个函数名。
function fn1() {}
console.log(fn1.name);
var fn2 = function() {};
console.log(fn2.name);
var fn3 = function fn3() {};
console.log(fn3.name);
2、length 属性 : 返回函数定义中参数的个数。
function fn(x, y) {}
console.log(fn.length);
作用域( scope )指的是变量存在的范围。 Javascript 只有两种作用域:一种是全局作用域,变量在整个程序中一直存在;另一种是函数作用域,
变量只在函数内部存在。
(1) 在函数外部声明的变量就是全局变量( global variable ),它可以在函数内部读取。
(2) 在函数内部定义的变量,外部无法读取,称为 “ 局部变 ” ( local variable )。
(3) 函数内部定义的变量,会在该作用域内覆盖同名全局变量。
1、 函数内部的变量提升
与全局作用域一样,函数作用域内部也会产生 “ 变量提升 ” 现象。 var 命令声明的变量,不管在什么位置,变量声明都会被提升到函数体的头部。
函数本身的作用域
函数本身也是一个值,也有自己的作用域。它的作用域绑定其声明时所在的作用域。
var a = 1;
var fn = function() {
console.log(a);
};
function fn1() {
var a = 2;
fn();
}
fn1(); //1
传递方式
JavaScript 的函数参数传递方式是传值传递( passes by value ),这意味着,在函数体内修改参数值,不会影响到函数外部。
// 原始数据类型
var a = 1;
function fn(a) {
a = 3;
}
fn(a);
console.log(a); //1
// 引用类型
var arr = [1, 2, 3];
function fn1(arr) {
arr = [4, 5, 6];
}
fn1(arr);
console.log(arr); //[1, 2, 3]
注意 , 虽然参数本身是传值传递,但是对于复合类型的变量来说,属性值是传址传递( pass by reference ),也就是说,属性值是通过
地址读取的。所以在函数体内修改复合类型变量的属性值,会影响到函数外部。
// 修改对象的属性值
var obj = {
attr : 1
};
function fn(obj) {
obj.attr = 2;
}
console.log(obj.attr);
// 修改数组的元素值
var arr = [1, 2, 3];
function fn(arr) {
arr[0] = 4;
arr[1] = 5;
arr[2] = 6;
}
fn(arr);
console.log(arr.toString());
标签:
原文地址:http://www.cnblogs.com/tanchaochao/p/5429052.html