函数实际上是对象。每个函数都是Function类型的实例,函数名实际上也是一个指向函数对象的指针。
Function
函数定义
1、函数通常是使用函数声明语法定义的,如下所示:
function sum(num1,num2){
return num1+num2;
}
2、定义变量并将其初始化为一个函数。
var sum = function(num1,num2){
return num1+num2;
};
注意:函数末尾有一个分号,就像声明其他变量一样。
3、使用Function构造函数。
var sum = new Function("num1","num2","return num1+num2");
不推荐使用这种方法,因为这种语法会导致解析两次代码
没有重载
将函数名想象为指针。
function addSomeNumber(num){
return num+100;
}
function addSomeNumber(num){
return num+200;
}
var result = addSomeNumber(100);
这个例子中声明了两个同名函数,而结果则是后面的函数覆盖了前面的函数。以上代码实际上与下面的代码没有什么区别。
var addSomeNumber = function(num){
return num+100;
};
addSomeNumber = function(num){
return num + 200;
};
var result = addSomeNumber(100); //300
在创建第二个函数时,实际上覆盖了引用第一个函数的变量addSomeNumber。
函数声明与函数表达式
函数声明与函数表达式的区别:解析器会率先读取函数声明,并使其在执行任何代码之前可用;至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。
alert(sum(10,10));
function sum(num1,num2){
return num1+num2;
}
以上代码完全可以正常运行。
而如果写成函数表达式的形式则会出错:
alert(sum(10,10));
var sum = function(num1,num2){
return num1+num2;
}
函数内部属性
在函数内部,有两个特殊的对象:arguments和this。
arguments:它是一个类数组对象,包含着传入函数中的所有参数,这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。
在阶乘函数中使用callee属性,可以避免与执行函数名的耦合。
function factorial(num) {
if(num <= 1){
return 1;
}else{
return num * arguments.callee(num-1);
}
}
this:引用的是函数执行的环境对象。
caller:ECMAScript5也规范了另一个函数对象的属性,caller。这个属性中保存着调用当前函数的函数的引用,如果是在全局作用域中调用当前函数,它的值为null。
函数属性和方法
每个函数包含两个属性:length和prototype,其中,length属性表示函数希望接收的命名参数的个数。
function sayName(name){
alert(name);
}
function sum(num1,num2){
return num1+num2;
}
function sayHi(){
alert("hi");
}
alert(sayName.length); //1
alert(sum.length); //2
alert(sayHi.length); //0
prototype:保存它们所有的实例方法。prototype属性不可枚举。
每个函数都包含两个非继承而来的方法:apply()和call()。这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。它们的作用相同,区别仅在于接收参数的方式不同。
单体内置对象
定义:由ECMAScript实现提供的、不依赖宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了。比如:Object、Array和String。还有两个单体内置对象:Global和Math。
Global对象
所有在全局作用域中定义的属性和函数,都是Global对象的属性。除此之外,Global对象还包含其他一些方法。
1、URI编码方法
encodeURI():主要用于整个URI,不会对本身属于URI的特殊字符进行编码。
encodeURIComponent():主要用于对URI中的某一段进行编码,会对它发现的任何非标准字符进行编码。
var uri = "http://www.wrox.com/illegal value.htm#start";
//"http://www.wrox.com/illegal%20value.htm#start"
alert(encodeURI(uri));
//"http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start"
alert(encodeURIComponent(uri));
使用encodeURI()编码后的结果是除了空格之外的其他字符都原封不动,只有空格被替换成了%20。而encodeURIComponent()方法则会使用对象的编码替换所有非字母数字字符。
与encodeURI()和encodeURIComponent()方法对应的两个方法分别是decodeURI()和decodeURIComponent()。
2、eval()方法
它就像是一个完整的ECMAScript解析器,它只接收一个参数,即要执行的ECMAScript字符串。
eval("alert("hi")");
等价于
alert("hi");
在eval()中创建的任何变量或函数都不会被提升,因为在解析代码的时候,它们被包含在一个字符串中;它们只在eval()执行的时候创建。
3、Global对象的属性
Global对象的属性4、window对象
在全局作用域中声明的所有变量和函数,就是window对象的属性。
var color = "red";
function sayColor(){
alert(window.color);
}
window.sayColor(); //"red"
Math对象
1、min()和max()方法
var max = Math.max(3,2,4,5,7);
alert(max); //7
var min = Math.min(3,45,7,1);
alert(min); //1
要找到数组中的最大或最小值,可以使用apply()方法:
var values = [1,2,3,4,5,6,7,8];
var max = Math.max.apply(Math,values);
2、舍入方法
将小数舍入为整数的方法:
Math.ceil():向上舍入
Math.floor():向下舍入
Math.round():标准舍入
3、random()方法
Math.random()方法返回大于等于0小于1的一个随机数。
如果你想选择一个1到10之间的数值,可以这样:
var num = Math.floor(Math.random() * 10 + 1);
如果选择一个2到10之间的数:
var num = Math.floor(Math.random() * 9 + 2);
4、其他方法
其他方法
网友评论