ECMAScript学习笔记(五)
栏目: JavaScript · 发布时间: 6年前
内容简介:在ECMAScript中,每个函数都是一个函数对象,都是Function类型的实例,且都和其他引用类型一样具有属性和方法。函数名实际上是一个指向函数对象的指针,不会和某个函数绑定。以上代码意味着,一个函数可能会有多个名字:
Function类型
在ECMAScript中,每个函数都是一个函数对象,都是Function类型的实例,且都和其他引用类型一样具有属性和方法。
函数名实际上是一个指向函数对象的指针,不会和某个函数绑定。
function sum(num1, num2) { return num1 + num2; } // 相当于: var sum = function(num1, num2) { return num1 + num2; }; var sum = new Function("num1", "num2", "return num1 + num2");
以上代码意味着,一个函数可能会有多个名字:
function sum(num1, num2) { return num1 + num2; } var anothorSum = sum; // 将一个anothorSum变量的值设置为sum的值。使得他们指向了同一个函数。
没有重载
ECMAScript函数是没有重载的。
function addSomeNumber(num) { return num + 100; } function addSomeNumber(num) { return num + 200; } // 相当于 var addSomeNumber = function(num) { return num + 100; } var addSomeNumber = function(num) { return num + 200; }
以上代码将addSomeNumber变量赋值为先后两个函数对象。后一个函数对象覆盖了前一个函数对象嗯。
函数的声明&函数表达式
对于函数声明,解析器会先读取声明,并使其在执行任何代码之前可用。而对于函数表达式,则必须等到解析器执行到他所在的代码行才会被解释。
作为值的函数
ECMAScript中的函数名本身就是一个变量,所以所有的函数都可以被当做值来使用。所以可以把一个函数传递给另一个函数,并且可以将一个函数作为另一个函数的结果返回。
function callSomeFunction(someFunction, someArgument) { return someFunction(someArgument); } function add10(num) { return num + 10; } var result1 = callSomeFunction(add10, 10); alert(result1); // 20
function createComparsionFunction(propertyName) { return function(object1, object2) { var value1 = object1[propertyName]; var value2 = object2[propertyName]; if (value1 < value2) { return -1; } else if (value1 > value2) { return 1; } else { return 0; } }; }
函数内部属性
arguments和this
arguments的作用是用于保存函数参数。而这个对象还有一个叫callee的属性,用于指向拥有这个arguments对象的函数。
对于一个递归函数:
function factorial(num) { if (num <= 1) { return 1; }else { return num * factorial(num - 1); } }
如果factorial函数被赋给另一个变量,而factorial变量被赋值为null的话……那么上述代码就挂了。
所以有了callee对象,就衍生了下面这样的用法:
function factorial(num) { if (num <= 1) { return 1; }else { return num * arguments.callee(num - 1); } }
这样函数名和函数体就解耦了。
另一个对象 this 其行为跟 Java 中的this类似。this引用的是函数赖以执行的环境对象。
eg: 在网页的全局作用域中调用函数时,则this引用的是window。
window.color = "red"; var o = {color: "blue"}; function sayColor() { alert(this.color); } o.sayColor = sayColor; o.sayColor(); // blue
ECMAScript 5规范了另一个函数对象的属性:caller。这个属性保存了调用当前函数的函数的引用。若在全局作用域中调用当前函数,则该值为null
函数属性和方法
每个函数都包含:length和prototype两个属性。
length:表示函数希望接收的明明参数的个数
prototype:包含了引用类型的所有实例方法
每个函数包含了:apply()和call()两个方法。这两个方法的用途都是在特定的作用域中调用函数。
apply():接收两个参数:运行函数的作用域,参数数组。
call():接收两个参数:运行函数的作用域,传入其余参数。
这两个方法能够扩充函数赖以运行的作用域。
eg:
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
基本包装类型
ECMAScript提供了三个特殊的引用类型:Boolean、Number、String.
每当读取一个基本类型值的时候,后台就会创建一个对应基本包装类型的对象。
引用类型和基本包装类型的区别在于对象的生存期:使用new操作符创建的引用类型的实例,在执行流离开当前作用域前都会一直被存在内存中。而自动创建的基本包装类型的对象,只存在于一行代码的执行瞬间之后会立即被销毁。
那么,就不能在运行时为基本类型值添加属性和方法了。
各种基本类型的用法之类的跟Java里面差不多,我就不记录了。嗯。
单体内置对象
内置对象就是:ECMAScript实现提供的不依赖于宿主环境的对象。
Global对象
Global不属于其他任何对象的属性或者方法,最终都是他的属性和方法。
1.URI编码方法:
encodeURI()和encodeURIComponent()方法可以对URI进行编码。
2.eval()方法
eval()方法相当于一个完整的ECMAScript解析器。能够接受一个要执行的ECMAScript代码的字符串。
然后就执行了。
4.window对象
Math对象
跟Java里的差不多,就懒得记了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 【每日笔记】【Go学习笔记】2019-01-04 Codis笔记
- 【每日笔记】【Go学习笔记】2019-01-02 Codis笔记
- 【每日笔记】【Go学习笔记】2019-01-07 Codis笔记
- Golang学习笔记-调度器学习
- Vue学习笔记(二)------axios学习
- 算法/NLP/深度学习/机器学习面试笔记
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Windows高级调试
Mario Hewardt、Daniel Pravat / 聂雪军 / 机械工业出版社 / 2009-5 / 79.00元
本书主要讲解Windows高级调试思想和工具,并涉及一些高级调试主题。本书内容主要包括:工具简介、调试器简介、调试器揭密、符号文件与源文件的管理、栈内存破坏、堆内存破坏、安全、进程间通信、资源泄漏、同步、编写定制的调试扩展、64位调试、事后调试、Windows Vista基础以及应用程序验证器的测试设置等。本书内容详实、条理清楚。 本书适合Windows开发人员、Windows测试人员和Windo......一起来看看 《Windows高级调试》 这本书的介绍吧!