函数的声明与定义
方式1:
function print(s) {
console.log(s);
}
方式2:
var print = function(s) {
console.log(s);
};
//方式2定义函数,如果使用了函数名,如下面代码的x,函数名在函数体外边无效。
var print = function x(){
console.log(typeof x);
};
X;// ReferenceError: x is not defined
方式3:不推荐使用
var foo = new Function(
'return "hello world"'
);
函数的调用
函数名加()表示还是调用,() 中间
function add(x, y) {
return x + y;
}
add(1, 1)
第一等公民
JavaScript 语言将函数看作一种值,与其它值(数值、字符串、布尔值等等)地位相同。凡是可以使用值的地方,就能使用函数。比如,可以把函数赋值给变量和对象的属性,也可以当作参数传入其他函数,或者作为函数的结果返回。函数只是一个可以执行的值,此外并无特殊之处。
函数名提升
JavaScript 引擎将函数名视同变量名,所以采用function命令声明函数时,整个函数会像变量声明一样,被提升到代码头部。所以,下面的代码不会报错。
f();
function f() { ... }
获取函数信息
- name属性获取函数的名字
function f1() {}
f1.name
// -----
var f2 = function () {};
f2.name
- length属性获取 函数定义之中的参数个数。
length属性提供了一种机制,判断定义时和调用时参数的差异,以便实现面向对象编程的”方法重载“(overload)。
function f(a, b) {}
f.length // 2
- toString方法返回一个字符串,内容是函数的源码。带// 注释
function f() {
a();
b();
c();
}
f.toString()
// function f() {
// a();
// b();
// c();
// }
作用域
作用域(scope)指的是变量存在的范围。在 ES5 的规范中,Javascript 只有两种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;另一种是函数作用域,变量只在函数内部存在。ES6 又新增了块级作用域。
- 在函数内部定义的变量,外部无法读取,称为“局部变量”(local variable)。
- 函数外部声明的变量就是全局变量(global variable),它可以在函数内部读取。
- 函数本身也是一个值,也有自己的作用域。它的作用域与变量一样,由其声明所在的位置决定。
同名参数
同名参数,最后面的覆盖前面的,前面的无效。
function f(a, a) {
console.log(a);
}
f(1, 2) // 2
arguments 对象
由于 JavaScript 允许函数有不定数目的参数,在内部是由 arguments对象机制实现的。
arguments对象包含了函数运行时的所有参数,arguments[0]就是第一个参数,arguments[1]就是第二个参数,以此类推。这个对象只有在函数体内部,才可以使用。
var f = function (one) {
console.log(arguments[0]);
console.log(arguments[1]);
console.log(arguments[2]);
}
f(1, 2, 3)
//输出1,2,3
js闭包
由于在 JavaScript 语言中,只有函数内部的子函数才能读取内部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。
function f1() {
var n = 999;
function f2() {
console.log(n);
}
return f2;
}
var result = f1();
result();
上面代码中,函数f1的返回值就是函数f2,由于f2可以读取f1的内部变量,所以就可以在外部获得f1的内部变量了。
闭包就是函数f2,即定义在某函数内部,读取该函数内部变量的函数。
立即执行函数
// 写法一
var tmp = newData;
processData(tmp);
storeData(tmp);
// 写法二
(function () {
var tmp = newData;
processData(tmp);
storeData(tmp);
}());
有时,我们需要在定义函数之后,立即调用该函数。这时,你不能在函数的定义之后加上圆括号,这会产生语法错误。
产生这个错误的原因是,JavaScript 引擎规定,如果function关键字出现在行首,一律解释成语句。因此,行首是function关键字,引擎认为这是函数的定义语句,不应该以圆括号结尾,所以就报错了。解决方法就是不要让function出现在行首,按表达式处理函数定义。最简单的方法,就是将其放在一个圆括号里面。
(function(){ /* code */ })();
eval命令
eval命令接受一个字符串作为参数,并将这个字符串当作语句执行。