Function类型

ECMAScript中函数是对象,每个函数都是Function类型的实例,也有属性和方法,函数是对象,函数名实际上市一个指向函数对象的指针,不会与某个函数绑定;

function sum(num1,num2){

return num1+num2;

}

同:

var sum=function(num1,num2){

return num1+num2;

};

(1)没有重载

若声明了两个同名函数,后面的函数会覆盖前面的函数;

(2)函数声明和函数表达式

解析器会率先读取函数声明,并使其在执行任何代码之前可以访问,而函数表达式,必须等到解析器执行到它所在的代码行,才会真正被解释执行;

alert(sum(10,10));

function sum(num1,num2){

return num1+num2;

}

以上代码正常执行,解析器在代码执行之前,读取并将函数声明添加到执行环境中,对代码求值时,js引擎在第一遍会声明函数并将它们放到源代码树的顶部;

以下代码中(函数表达式方法),在执行期间导致错误

alert(sum(10,10));

var sum=function(num1,num2){

return num1+num2;

}

函数位于一个初始化语句中,而不是一个函数声明,在执行到函数所在的语句之前,变量sum中不会保存有对函数的引用;

(3)作为值的函数

函数本身就是变量,函数可以作为值来使用,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回;

function callSomeFunction(somFunction,someArgment){

return someFunction(someArgment);

}

function add10(num){

return num+10;

}

var result=callSomeFunction(add10,10);

alert(result);   //20

可以从一个函数中返回另一个函数

function createComparisonFunction(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;

}

};

}

(4)函数内部属性

在函数内部有两个特殊的对象:arguments和this;

arguments保存函数参数,还有个callee属性,为一个指针,指向拥有这个arguments对象的函数;

function factorial(num){

if(num<=1){

return 1;

}else{

return num*arguments.callee(num-1);

}

}

this引用的是函数据以执行的环境对象;

ECMAScript5规范了另一个函数对象属性:caller,这个属性中保存着调用当前函数的函数的引用;如果是在全局作用域中调用当前函数,它的值为null;

当函数在严格模式下运行时,访问arguments.callee会导致错误,argumen.caller也是,在非严格模式下这个属性始终是undefined;

在严格模式下不能为函数的caller属性赋值,否则会导致错误;

(5)函数属性和方法

每个函数都包含两个属性:length和prototype;

length属性表示函数希望接收的命名参数的个数;

对于ECMAScript中的引用类型而言,prototype是保存它们所有实例方法的真正所在,prototype属性不可枚举;

每个函数都包含两个非继承而来的方法:apply和call;在特定的作用域中调用函数,即设置函数体内this对象的值;

apply方法接收两个参数:一个是在其中运行函数的作用域,另一个是参数数组(可以是Array的实例,也可以是arguments);

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

在严格模式下,为指定环境对象而调用函数,this值不会转型为window;

call方法,传递给函数的参数必须逐个列举出来

function sum(num1,num2){

return num1+num2;

}

function callSum(num1,num2){

return sum.apply(this,num1,num2);

}

alert(callSum(10,10)); //20

apply和call真正强大的地方时能够扩充函数赖以运行的作用域;

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

ECMAScript5还定义了bind方法,这个方法会创建一个函数实例,其this值会被绑定到传给bind函数的值:

window.color=”red”;

var o={color:”blue”};

function sayColor(){

alert(this.color);

}

var objectSayColor=sayColor.bind(o);

objectSayColor();  //blue

每个函数继承的toLocalString和toString方法始终都会返回函数的代码;

JavaScript读书笔记(6)-Function的更多相关文章

  1. YDKJ 读书笔记 01 Function vs. Block Scope

    Introduction 本系列文章为You Don't Know JS的读书笔记. 书籍地址:https://github.com/getify/You-Dont-Know-JS Scope Fro ...

  2. 数据结构与算法JavaScript 读书笔记

    由于自己在对数组操作这块比较薄弱,然后经高人指点,需要好好的攻读一下这本书籍,原本想这个书名就比较高深,这下不好玩了.不过看着看着突然觉得讲的东西都比较基础.不过很多东西,平时还是没有注意到,故写出读 ...

  3. 你不知道的javascript读书笔记3

    概述 这是我看<你不知道的JavaScript(中卷)>中关于类型检查的笔记,供以后开发时参考,相信对其他人也有用. typeof 我们知道js中有七种内置类型:undefined, nu ...

  4. JavaScript读书笔记(1)

    从今天开启每天看书记笔记模式,<JavaScript高级程序设计(第3版)> 1. Javascript最初是为了解决输入验证器的问题,现在已经发展成一门复杂的语言: 2.  语言标准为E ...

  5. 高性能的JavaScript -- 读书笔记

    高性能的JavaScript 一.      加载和运行 将脚本放在底部 脚本下载解析执行时,页面已经加载完成并显示在用户面前 成组脚本 减少外部脚本文件数量,整合成一个文件 延迟脚本 动态脚本元素 ...

  6. <你不知道的JavaScript>读书笔记

    近几天看了一本不错的 JavaScript 的书,是 Kyle Simpson 写的 <You Don't know JS>.这本书是 Kyle Simpson 在 Github 上的开源 ...

  7. 高性能JavaScript读书笔记

    零.组织结构 根据引言,作者将全书划分为四个部分: 一.页面加载js的最佳方式(开发前准备) 二.改善js代码的编程技巧(开发中) 三.构建与部署(发布) 四.发布后性能检测与问题追踪(线上问题优化) ...

  8. javascript学习笔记 - 引用类型 Function

    五 Function类型 每个函数都时Function类型的实例.函数也是对象. 声明函数: function func_name () {} //javascript解析器会在程序执行时率先读取函数 ...

  9. JavaScript读书笔记(2)--数据类型

    1.  严格模式:在javascript中定义了一种不同的解析与执行模型.在严格模式下,一些不确定的行为将得到处理,对某些不安全的操作也会抛出错误. 用法是在脚本中添加:”use strict”; 这 ...

随机推荐

  1. UBUNTU命令行下进程查看-终止

    ps ax   显示当前系统进程的列表 ps aux 显示当前系统进程详细列表以及进程用户 如果输出过长,可能添加管道命令 less  如  ps ax|less 查看具体进程,使用 grep命令如  ...

  2. ftk学习记(label篇)【转】

    转自:http://blog.csdn.net/feixiaoxing/article/details/25000093 版权声明:本文为博主原创文章,未经博主允许不得转载. [ 声明:版权所有,欢迎 ...

  3. 设置div自适应高度滚动

    <body> <div id="divc" style="overflow: auto;"> </div> <a id ...

  4. android的动态代码

    1,Android代码设置Shape,corners,Gradient  (http://blog.csdn.net/houshunwei/article/details/17392409) int ...

  5. DB2 数据库中字段特定字符替换为空

    Update RM_CarInfo set ImportTitle = Replace(ImportTitle,'ZD','') WHERE ImportTitle LIKE'%ZD%';

  6. 洛谷——P1130 红牌

    题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括N个步骤.每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件.为了加快进程,每一步政府都派了 ...

  7. Single Number II - LeetCode

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  8. mysql之select,insert,delete,update

    写在前面 上篇文章学习了创建数据库和数据表,这篇文章将学习对数据表的增删改查操作. 系列文章 mysql之创建数据库,创建数据表 一个例子 上篇文章中,创建了数据库和数据表,数据表中还没有数据,这里我 ...

  9. 主机屋 ubuntu 14安装nginx

    http://www.cnblogs.com/piscesLoveCc/p/5794926.html 安装gcc g++的依赖库 1 sudo apt-get install build-essent ...

  10. 某音乐类App评论相关API的分析及SQL注入尝试

    关键字:APIfen.工具使用.sql注入 涉及工具/包:Fiddler.Burpsuite.Js2Py.Closure Compiler.selenium.phantomjs.sqlmap 摘要: ...