1、函数实际上是对象
每个函数都是Function类型的一个实例,与其他引用类型一样具有属性和方法的。函数名实际上是一个指向函数对象的指针。
2、没有重载
3、函数声明提前
var name = 'World!';
(function () {
if (typeof name === 'undefined') {
var name = 'Jack';
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
})();
//输出为 Goodbye Jack解释:var 声明的作用域在整个 function 中, 但并没有初始化。简单说,浏览器的JavaScript引擎首先会扫描所有的变量声明,并把变量声明上升到作用域的顶部,但是又不会改变变量赋值的位置。因此在实际的代码运行中,由于内层函数域的重新初始化干扰,外层域初始化'name'是假象,这就导致了在'name'未没初始化赋值之前,就判断其值,肯定是'undefined'。
3、作为值的函数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>
4、函数内部属性
在函数的内部,有两个特殊的对象:arguments和this。arguments包含着传入函数的所有参数,这个对象有一个callee属性,该属性是一个指针,指向拥有这个arguments对象的函数。
function factorial(num){
if (num <= 1) {
return 1;
} else {
return num * arguments.callee(num-1)
}
}
var trueFactorial = factorial;
factorial = function(){
return 0;
};
alert(trueFactorial(5)); //120
alert(factorial(5)); //0
//阶乘函数
5、函数属性和方法
每个函数都包含两个属性:length和prototype。
length表示函数希望接收的命名参数个数,函数定义了一个参数,length的值为1。。。。
prototype
每个函数都包含两个非继承而来的方法:apply()和call()
这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内的this对象的值。他们最强大的功能是扩充函数懒以运行的作用域。
如:<script type="text/javascript">
window.color = "red";
var o = { color: "blue" };
function sayColor(){
alert(this.color);
}
sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue
</script>
apply()方法接收两个参数:一个是在其中的运行函数的作用域,另一个是参数数组
<script type="text/javascript">
function sum(num1, num2){
return num1 + num2;
}
function callSum1(num1, num2){
return sum.apply(this, arguments);
}
function callSum2(num1, num2){
return sum.apply(this, [num1, num2]);
}
alert(callSum1(10,10)); //20
alert(callSum2(10,10)); //20
</script>
<script type="text/javascript">
function sum(num1, num2){
return num1 + num2;
}
function callSum(num1, num2){
return sum.call(this, num1, num2);
}
alert(callSum(10,10)); //20
</script>
看了《高级程序设计第三版》做的一些总结。