JavaScript学习笔记整理(6):函数
function name() {}
name是函数名称标识符。函数名称是函数声明语句必需的部分。不过对于函数表达式来说,名称是可选的:如果存在,该名字只存在于函数体内,并指向该函数对象本身。
圆括号:圆括号内可放置0个或多个用逗号隔开的标识符组成的列表,这些标识符就是函数的参数名称。
花括号:可包含0条或多条JavaScript语句。这些语句构成了函数体。一旦调用函数,就会执行这些语句。
(2)函数表达式
var f = function(x){
console.log(x);
}
采用函数表达式声明函数时,function命令后面不带有函数名。如果加上函数名,该函数名只在函数体内部有效,在函数体外部无效。
var f=new Function('x','y','return x+y');
等价于
var f=function(x,y){
return x+y;
}
除了最后一个参数是函数体外,前面的其他参数都是函数的形参。如果函数不包含任何参数,只须给构造函数简单的传入一个字符串---函数体---即可。
不过,Function()构造函数在实际编程中很少会用到。function f(){
console.log(1);
}
f() //1
function f(){
console.log(2);
}
f() //2
函数可以调用自身,这就是递归(recursion)function f(x){
if(x>2){
console.log(x);
return f(x-1);
}else{
return 1;
}
}
f(4);
// 4
//3
不能再条件语句中声明函数
2、函数命名f()
function f(){}
f();
var f = function (){};
// TypeError: f is not a function
var f;
f();
f = function() {};
function go(){
function play(){}
return play();
}
5、函数调用- 作为函数
- 作为方法
- 作为构造函数
- 通过它们的call()和apply()方法间接调用
f();
5.2方法调用
o.f=funciton(){}
o.f();
5.3构造函数调用var o=new Object();
var o=new Object;
5.4间接调用
function go(x,y){
x = x || 1;
y = y || 2;
}
注意:当用这种可选实参来实现函数时,需要将可选实参放在实参列表的最后。那些调用你的函数的程序员是没法省略第一个参数并传入第二个实参的。
function go(x){
console.log(arguments[0]);
console.log(arguments[1]);
}
go(1,2);
//1
//2
arguments有一个length属性,用以标识其所包含元素的个数。function f(x){
console.log(arguments.length);
}
f(1,2) // 2
注意:arguments并不是真正的数组,它是一个实参对象。每个实参对象都包含以数字为索引的一组元素以及length属性。function f(x){
console.log(x); // 1
arguments[0]=null;
console.log(x); // null
}
f(1);
在上面的例子中,arguments[0]和x指代同一个值,修改其中一个的值会影响到另一个。
注意:如果有同名的参数,则取最后出现的那个值。function f(x,x){
console.log(x);
}
f(1,2) // 2
callee和caller属性var a=1;
function f(){
console.log(a)
}
f() //1
上面的代码中,函数f内部可以读取全局变量a。function f(){
var a=1;
}
v //ReferenceError: v is not defined
var a=1;
function f(){
var a=2;
console.log(a);
}
f() //2
a //1
function f(x){
if(x>10){
var a = x -1;
}
}
//等同于
function f(x){
var a;
if(x>10){
a = x - 1;
}
}
11、函数属性、方法和构造函数
function f(){}
f.name //f
length属性function f(x,y){}
f.length //2
prototype属性
每一个函数都包含一个prototype属性,这个属性指向一个对象的引用,这个对象称做“原型对象”(prototype object)。
function f(){
return 1;
}
f.toString()
//function f(){
// return 1;
//}
function f(a){
return function(){
return a++;
};
}
var c=f(1);
console.log(c()); //1
console.log(c()); //2
console.log(c()); //3
(function(){
statement
}())
!function(){}();
~function(){}();
-function(){}();
+function(){}();
eval('var a=1');
a //1
eval没有自己的作用域,都在当前作用域内执行(function(){
'use strict';
eval('var a=1');
console.log(a); //ReferenceError: a is not defined
})();