标签:
【javascript 高级程序设计 第5章 page 110】
5.5 Function类型-------函数是对象 函数名是引用/指针;
函数是对象。因此函数名实际上也是一个指向函数对象的指针。不会与某个函数绑定。
每个函数都是Function 类型的实例,与其它引用属性一样具有属性和方法、
创建函数的方法:
1.使用函数声明语法定义的 即使用function定义 函数名是必须的例如
function sum (sum1,sum2 ){
return sum1+sum2;
}
2.使用函数表达式第一函数.。
需要注意的是最后的封号【跟声明一个变量一样】,以及function后面没有函数名【因为使用函数表达式定义函数时,没有必要使用函数名--通过变量sum对函数的引用来调用函数】
var sum= function(num1,num2){
retrun num1+ num2;
};
3.使用Function构造函数来定义函数【不推荐使用】
Function构造函数可以接受任意数量的参数。但最后一个参数始终都被看成一个函数体,而前面的参数则枚举处理新函数的参数。 不推荐使用因为这种构造器语法会导致解析两次代码(第一次是解析偿付的ECMAScript 代码,第二次是解析传入构造函数中的字符串 这里的意思应该是 函数体被解析两次 这句话暂时不是很懂下面的构造函数的其他效率问题是我搜的网上面的),故而影响性能例
var sum = new Function("num1","num2","return num1+num2");
Function()构造函数允许运行时Javascript代码动态的创建和编译。在这个方式上它类似全局函数eval()。
Function()构造函数每次执行时都解析函数主体,并创建一个新的函数对象。所以当在一个循环或者频繁执行的函数中调用Function()构造函数的效率是非常低的。相反,函数字面量却不是每次遇到都重新编译的。
4.函数名仅仅只是引用
下例中首先定义了一个名为suma()函数,用于求和、然后声明了变量anothersum将suma赋给anthersum。使用不带圆括号的函数名suma是访问函数指针(即suma是对函数的引用),而非调用函数。此时another与suma都指向同一个函数
例如
function suma(sum1,sum2 ){
return sum1+sum2;
alert (sum(10,10)); //20
var antherSum = suma;
alert(anotherSum(10,23)); //33
suma = null;
alert(antherSum(10,23)) //33
55.1 JS没有重载, 【函数名只是对函数对象的引用类似于指针 故没有重载】
若声明两个相同函数名的函数,结果后面的函数会覆盖前面的的函数。
例如
var addSomeNumber = function (num){
return num +100;
};
var addSomeNumber = function (num){
return num + 200;
};
var result = addSomeNumber(100); //答案是调用下面的一个函数300
5.52 函数声明 与函数表达式【区别】
1.JS解析器是如何解析函数声明和函数表达式的?
函数声明: JS解析会率先读取函数声明,保证其在执行任何代码之前可用;下例一中 在代码执行之前,解析器就已经通过一个名为函数声明提升器(function declaration hoisting)的过程,读取并将函数声明添加到执行环境中(JavaScript引擎在第一遍会声明函数并将它们放到源代码树的顶部:故声明函数代码可以在调用该函数的代码之后)
函数表达式:则必须等到解析器按顺序执行到它所在代码行,才会被真正被解释 (如下图第二个程序sum是一个变量 执行到此句时 才会建立起对函数的引用)【故 函数声明相当于java中方法,而函数表达式就是new 一个对象 要先建立引用之后才可以调用 在简单一点他就是赋值语句】
alert(sum(10,10)), //可执行结果为20
function sum(num1,num2){
return num1+num2;
}
alert(sum(10,10)), // 运行期间产生错误 原因在执行到函数所在的语句之前,变量sum中不会保存对函数的引用:回报“unexpected identifier”(意外标识符错误)
var sum = function(num1,num2){
return num1+num2;
};
当然可以同时使用函数声明和函数表达式例如 var sum = funciton sum(){}不过该语法在Safari中会导致错误
5.5。3 作为值的函数
1. 将函数作为值来传递:由于ECMAScript 中的函数名本身就是变量
<!DOCTYPE html>
<html>
<head>
<title>Function as an Argument Example</title>
<script type="text/javascript">
function callSomeFunction(someFunction, someArgument){
return someFunction(someArgument);
}
function add10(num){
return num + 10;
}
var result1 = callSomeFunction(add10, 10);
alert(result1); //20
function getGreeting(name){
return "Hello, " + name;
}
var result2 = callSomeFunction(getGreeting, "Nicholas");
alert(result2); //Hello, Nicholas
</script>
</head>
<body>
</body>
</html>
从一个函数中返回另一个函数,这是极为有用的技术。
moon 01/14 javascript -- Funtion类型
标签:
原文地址:http://www.cnblogs.com/aishangliuling/p/5134729.html