您的位置:首页 > Web前端 > JavaScript

JS:关于JS引用类型——Function类型

2017-02-28 14:25 274 查看
函数是对象,而每个具体的函数都是该对象的一个实例。也因为函数是对象,所以函数名是一个指向函数对象的指针。

函数的声明

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接受多个参数,最后一个参数将被作为函数体解析。
这种方式并不推荐,因为在解析时,需要解析两次,一次是正常的常规解析ECMAScript代码,一次是解析构造函数中的字符串。

但可以清晰地看出,函数是对象,函数名是指针。

4.函数声明和函数表达式的差异
二者的差异在于——
使用函数声明,解析器会先解析使用函数声明的函数(在代码执行之前),通过函数声明提升的方式将函数声明的函数放在执行环境中(这样调用函数时就像全局变量一样可被找到)。
但是使用函数表达式的函数则只能在解析器执行到它所在的代码行时才会被执行。
举一个例子:
sum(10, 10);
function sum(num1, num2){
return num1+num2;
}
//这是ok的
sum(10, 10);
var sum = function(num1, num2){
return num1+num2;
};
//这是错的

函数的内部属性

1.arguments对象
主要用于保存参数值的一个类数组对象,但是还有两个特殊的属性——callee和caller。
arguments.callee:是一个指向拥有arguments对象的函数的指针。常常用于解除函数名和函数体之间的耦合。
function factorial(num) {
if(num <= 1) {
return 1;
} else {
return num * arguments.callee(num-1);
}
}
arguments.caller:是一个指向调用当前函数的函数的引用。

2.this对象
this引用的是函数据以执行的环境对象。

函数属性和方法

1.函数名.length:用于存放函数希望传入的参数个数。

2.函数名.prototype:对于所有的引用类型来说,prototype是用于存放所有实例方法的所在。

3.apply() & call():apply(指定函数体内this的引用,参数对象/数组),call(指定函数体内this的引用,参数1,参数2,...)
apply和call最重要的是它可以扩充函数的作用域,例如
window.color = "red";
var o = {
color: "blue"
};

function sayColor(){
alert(this.color);
}

sayColor(); // red
o.sayColor = sayColor; //添加方法
o.sayColor(); // blue
sayColor.call(o); //blue, 扩充了sayColor的作用域还使对象和方法没有耦合关系


函数的内部属性和函数属性还是有区别的,函数的内部属性是只能在函数内部使用的,函数属性则是可以通过“.”来获取的。

String、Boolean、Number三个特殊的引用类型(基本包装类型:生存期更短)

引用类型?还是基本数据类型?ECMAScript在这上面好像傻傻分不清楚
但是,我认为String等还是基本数据类型要更多一些,但是为什么基本数据类型又存在方法呢?
原理是这样的:
var str = "I am a string";
var str1 = str.substring(2);
//执行到这一句,其实后台帮我们实现了很多
//var str = new String("I am a string");
//var str1  = str.substring(2);
//str = null;销毁这个实例
在这里我还有个疑问:若str将作为String的一个实例,那str=null后应该不可用才对。但是alert(str)确实是“I am a string”。所以我觉得在后台应该不是使用str创建实例而是用其他变量来创建后销毁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: