function name() {}
name是函數名稱標識符。函數名稱是函數聲明語句必需的部分。不過對于函數表達式來說,名稱是可選的:如果存在,該名字只存在于函數體內,并指向該函數對象本身。
圓括號:圓括號內可放置0個或多個用逗號隔開的標識符組成的列表,這些標識符就是函數的參數名稱。
花括號:可包含0條或多條JavaScript語句。這些語句構成了函數體。一旦調用函數,就會執(zhí)行這些語句。
(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、函數調用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并不是真正的數組,它是一個實參對象。每個實參對象都包含以數字為索引的一組元素以及l(fā)ength屬性。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沒有自己的作用域,都在當前作用域內執(zhí)行(function(){
'use strict';
eval('var a=1');
console.log(a); //ReferenceError: a is not defined
})();
更多建議: