《JS高程》--Function引用类型知识点
1.JS中函数的定义方法有哪些?
答:三种定义方法:
- 函数声明语法:function sum(num1,num2){return num1+num2;}
- 函数表达式:var sum=function(num1,num2){return num1+num2 ;};
- 构造函数:var sum= new Function("num1","num2","return num1+num2");
2.以上三种函数定义方法的区别在哪里?
答:两个区别:
- 函数声明和函数表达式比较常用,主要区别在于解析器的处理不同,第一种(函数声明)在所有代码执行前被解析;第二种(函数表达式)在执行到该行代码时被解析。
- 构造函数方法不推荐使用,因为需要解析两次代码:首先常规解析代码,接着解析传入构造函数中的字符串。
3.函数名的本质是什么?
答:函数名实际是一个指向函数对象的指针,不会与某个函数绑定。
4.函数是否可以重载?【考察通常是一段程序,给结果】
答:函数没有重载。声明了两个同名的函数时,后面的函数将会覆盖前面的函数,原理为:函数名只是一个指向函数对象的指针。
5.函数作为值进行传递和作为结果返回的实例?
答:函数可以作为值来使用,不仅可以将一个函数传递给另一个函数,还可以将一个函数作为另一个函数的返回结果,实例如下:
- var sum=function(num1,num2){return num1+num2; };
var anothersum=sum;//作为值传递
- function callSomeFunction(someFunction,someArgument){
return someFunction(someArgumnet);//someFunction作为callSomeFunction的结果返回
}
6.函数内部的两个对象分别是什么?都各自有什么属性方法?
答:两个特殊的对象分别是arguments对象和this对象
- arguments对象:类数组,存储传入函数中的所有参数,
callee属性,返回一个指向拥有这个arguments对象的函数的指针(即函数名),主要用于松散递归调用的紧密耦合
代码说明:sum.arguments.callee(num1,num2)等价于sum(num1,num2)
- this对象:引用的是函数执行的环境对象--作用域有关
7.函数的其他属性和方法有哪些?
答:
- 属性:length属性:函数希望接收的命名参数的个数;
prototype属性:是保存所有引用类型的实例方法的真正所在。通常含有valueOf()等方法。主要用于继承。
- 方法:apply()和call()方法:在特定的作用域中调用函数。
bind()方法:用于创建一个函数的实例,且将this值绑定为传给bind()方法的参数。
例: var colorObject=sayColor.bind(o);
colorObject.sayColor();//该函数的this指向o
8.说说函数的apply()和call()方法的异同点?
答:
- 含义相同,可以传递参数和扩充函数作用域,主要区别在于参数不同
apply()方法的参数为(this,arguments或者[num1,num2])//第二个参数为arguments 对象或者数组
call()方法的参数为(this,num1,num2)//需要逐个列举出来。
- **扩充作用域的做法:
代码说明:window.color="red";
var o={color:"blue"};
var sayColor=function(){
alert(this.color);
};
sayColor();//red
sayColor.call(this);//red
sayColor.call(window);//red
sayColor.call(o);//blue