JS:关于JS引用类型——Function类型
2017-02-28 14:25
274 查看
函数是对象,而每个具体的函数都是该对象的一个实例。也因为函数是对象,所以函数名是一个指向函数对象的指针。
2.函数表达式
3.使用Function构造函数
这种方式并不推荐,因为在解析时,需要解析两次,一次是正常的常规解析ECMAScript代码,一次是解析构造函数中的字符串。
但可以清晰地看出,函数是对象,函数名是指针。
4.函数声明和函数表达式的差异
二者的差异在于——
使用函数声明,解析器会先解析使用函数声明的函数(在代码执行之前),通过函数声明提升的方式将函数声明的函数放在执行环境中(这样调用函数时就像全局变量一样可被找到)。
但是使用函数表达式的函数则只能在解析器执行到它所在的代码行时才会被执行。
举一个例子:
主要用于保存参数值的一个类数组对象,但是还有两个特殊的属性——callee和caller。
arguments.callee:是一个指向拥有arguments对象的函数的指针。常常用于解除函数名和函数体之间的耦合。
2.this对象
this引用的是函数据以执行的环境对象。
2.函数名.prototype:对于所有的引用类型来说,prototype是用于存放所有实例方法的所在。
3.apply() & call():apply(指定函数体内this的引用,参数对象/数组),call(指定函数体内this的引用,参数1,参数2,...)
apply和call最重要的是它可以扩充函数的作用域,例如
函数的内部属性和函数属性还是有区别的,函数的内部属性是只能在函数内部使用的,函数属性则是可以通过“.”来获取的。
但是,我认为String等还是基本数据类型要更多一些,但是为什么基本数据类型又存在方法呢?
原理是这样的:
函数的声明
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创建实例而是用其他变量来创建后销毁。
相关文章推荐
- 关于JS那些引用类型 实际应用的问题
- 关于基本类型和引用类型的值传递以及function方法的参数传递
- js class模型 关于 初始化key值为非基本类型是 实例之间是引用该变量
- ECMAScript——引用数据类型之function关于call和apply
- js中判断Object、Array、Function等引用类型对象是否相等
- js中判断Object、Array、Function等引用类型对象是否相等的方法
- 关于js的引用类型
- JS关于引用类型的总结
- 对js中的引用类型的理解(4)——Function类型
- 【JS】引用类型之Function
- js中判断Object、Array、Function等引用类型对象是否相等
- 关于c#值类型和引用类型
- 关于值类型和引用类型的备忘
- (JavaScript)观察到关于validaterulers中引用过来的js
- 关于值类型和引用类型的区别和总结
- 关于string是值类型还是引用类型- -
- 关于引用项目中的图像(文本,或其它类型二进制)等文件
- 关于值类型和引用类型比较的问题
- 初学者的疑问:关于java引用类型标识符
- 关于引用js文件中出现乱码问题的解决方案