function类型

每个函数都是function类型的实例,函数是对象,函数名是指向对象的指针

function sum(num1,num2)

  {

  return num1+num2;

  }

//等价于

var sum=function (num1,num2)

  {

  return num1+num2;

  };

//function构造函数,解析两次第一次是常规的ECMAScript代码,第二次解析传入的字符串,影响性能故不推荐

var sum=new Function("num1","num2","return num1+num2");

函数名只是指针,类似变量,一个函数可以有多个名字

function sum(num1,num2)

  {

  return num1+num2;

  }

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

var anotherSum=sum;

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

sum=null;

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

函数名只是指针所以ECMAScript中没有函数重载的概念,两个同名函数后声明的会覆盖先一个声明的

function addSomeNumber()

  {

  return num+100;

  }

function addSomeNumber()

  {

  return num+200;

  }

var result=addSomeNumber(100);  //300

解析器会率先读取函数声明,并添加函数声明到执行环境中,这个过程叫做 函数声明提升,即使调用它的代码写在声明之前,整个代码也能正常工作

alert(sum(10,10));

function sum(num1,num2)

  {

  return num1+num2;

  }

而对于函数表达式则是正常的一行一行解析

alert(sum(10,10));  //"unexpected identifier"(意外标识符错误)

var sum=function (num1,num2)

  {

  return num1+num2;

  };

函数名本身就是变量,所以函数可以当作值来使用

function callSomeFunction(someFunction,someArgument)

  {

  return someFunction(someArgument);

  }

function add10(num)

  {

  return num+10;

  }

var result1=callSomeFunction(add10,10);

alert(result1);  //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;

        }

    };

  }

var data=[{name:"Zachary",age:28},{name:"Nicholas",age:29}];

data.sort (createComparisonFunction("name"));//sort(1)则调换位置

alert(data[0].name);  //Nicholas

data.sort (createComparisonFunction("age"));

alert(data[0].name);  //Zachary

函数内部有两个特殊对象arguments和this

arguments是一个类数组对象,包含着传入数组中的所有参数,它有一个属性callee,该属性是一个指针,指向拥有这个arguments对象的函数

function factorial(num)

    {

    if(num<=1)

      {

      return 1;

      }

    else

    {

      return num*factorial(num-1)

    }

    }

这个函数的执行与函数名factorial紧紧耦合在了一起

function factorial(num)

    {

    if(num<=1)

      {

      return 1;

      }

    else

    {

      return num*arguments.callee(num-1)

    }

    }

函数内部另一个特殊对象是this,this引用的是函数据以执行的环境对象,全局作用域便是window

window.color="red";

var o={color:"blue"};

function sayColor()

  {

  alert(this.color);

  }

sayColor();  //"red"

o.sayColor=sayColor;

o.sayColor();  //"blue"

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

function outer()

  {

  inner();

  }

function inner()

  {

  alert(inner.caller);

  }

outer();

警告框显示outer()函数的源代码

function outer()

  {

  inner();

  }

function inner()

  {

  alert(arguments.callee.caller);  //减少耦合

  }

outer();

ECMAScript中函数是对象,所以函数也有方法和属性:length和prototype

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

function sayHi()

  {

  alert("Hi")

  }

alert(sayHi.length);  //0

对于ECMAScript中的引用类型,prototype是它们所有实例方法的真正所在,如toString()和valueOf()等,ECMAScript5中prototype属性不可枚举,使用for-in无法发现

每个函数都包含2个非继承而来的方法:apply()和call(),两个方法的用途都是在特定的作用域中调用函数,实际等于设置函数体内this对象的值

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

function sum(num1+num2)

  {

  return num1+num2;

  }

function callSum1(num1,num2)

  {

  return sum.apply(this,arguments);  //传入arguments对象

  }

function callSum2(num1,num2)

  {

  return sum.apply(this,[num1,num2]);  //传入数组

  }

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

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

call()方法与apply()方法作用相同,区别在于接收参数的方式不同,第一个参数this不变,第二个参数必须逐个列举出来

function sum(num1+num2)

  {

  return num1+num2;

  }

function callSum(num1,num2)

  {

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

  }

传递参数并非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(0);  //blue

ECMAScript5还定义了bind(),这个方法会创建一个函数的实例,绑定作用域,看例子

window.color="red";

var o={color:"blue"};

function sayColor()

  {

  alert(this.color);

  }

var objectSayColor=sayColor.bind(o);

objectSayColor();  //blue

每个函数继承的toLocaleString()和toString()还有valueOf()方法始终返回函数的代码,返回代码的格式因浏览器而异,这些信息在调试代码时倒是很有用

----------------------------------------------------------------学习专注------------------------------------------------------------------

JavaScript高级程序设计7.pdf的更多相关文章

  1. JavaScript高级程序设计61.pdf

    JSON对象 早期的JSON解析器就是使用JavaScript的eval()函数,ECMAScript5对解析JSON的行为做出了规定,定义了全局对象JSON. JSON对象有2个方法:stringi ...

  2. JavaScript高级程序设计60.pdf

    错误处理 try-catch语句 try{ //可能会导致错误的代码 }catch(error){ //在错误发生时如何处理 } error是一个包含着错误信息的对象,它有一个message属性,保存 ...

  3. JavaScript高级程序设计58.pdf

    15章 使用Canvas绘图 略 16章 HTML5脚本编程 HTML5规范了新的HTML标记和JavaScript API,以便简化创建动态Web界面的工作 跨文档消息传递 简称XDM,指来自不同域 ...

  4. JavaScript高级程序设计57.pdf

    表单序列化 首先了解一下浏览器如何将数据发送给服务器 对表单字段的名称和值进行URL编码,使用和号(&)分隔 不发送禁用的表单字段 只发送勾选的复选框和单选按钮 不发送type为“reset” ...

  5. JavaScript高级程序设计55.pdf

    输入模式 HTML5为文本字段新增了pattern属性,这个属性的值是一个正则表达式,用于匹配文本框中的值 例如,只想在允许在文本字段中输入数值 <input type="text&q ...

  6. JavaScript高级程序设计54.pdf

    过滤输入 对于一些浏览器,可以使用正则表达式里的text()测试用户按下的按键,Firefox和safari(3.1版本之前)会对向上向下.退格键和删除键触发keypress事件,在Firefox中, ...

  7. JavaScript高级程序设计53.pdf

    共有的表单字段方法 每个表单字段都有两个方法:focus()和blur(),其中focus()用于将浏览器焦点设置到表单字段,激活表单字段.可以侦听页面的load事件 EventUtil.addHan ...

  8. JavaScript高级程序设计52.pdf

    表单脚本 表单的基础知识 在HTML中,表单是由<form>元素表示的,在Javascript对应的是HTMLFormElement类型,它继承自HTMLElement,因此具有与其他HT ...

  9. JavaScript高级程序设计50.pdf

    hashchange事件 HTML5新增了hashchange事件,以便在URL的参数列表(及URL中“#”号后面的所有字符串)发生变化时通知开发人员,之所以新增这个事件,是因为在Ajax应用中,开发 ...

  10. JavaScript高级程序设计49.pdf

    HTML5事件 contextmenu事件 contextmenu事件是冒泡的,可以将事件处理程序指定到document,这个事件的目标是用户操作的元素,在兼容DOM的浏览器中使用event.prev ...

随机推荐

  1. 检测SqlServer服务器IO是否瓶颈

    通过性能监视器监视 Avg. Disk Queue Length   小于2 Avg. Disk sec/Read , Avg. Disk sec/Write  小于10ms 可以用数据收集器定时收集 ...

  2. How to hanganalyze and systemstate dumps

    Oracle support request hang analysis and system state dumps when rasing SR. One 10.1 or higher versi ...

  3. iOS支付总结

    内容大纲: 一.常见的支付方案简介 二.第三方支付SDK 三.苹果官方支付方案 四.Web支付方案 正文: 一.常见的支付方案简介 在微信支付中 微信支付的网址是: https://pay.weixi ...

  4. asp.net mvc Ajax服务器跳转

    1.过滤器权限验证 [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowM ...

  5. 将requirejs进行到底(2)

    前一篇:JS模块化工具requirejs教程(一):初识requirejs 我们以非常简单的方式引入了requirejs,这一篇将讲述一下requirejs中的一些基本知识,包括API使用方式等. 基 ...

  6. 使用APPLICATION制作缓存,转存一下,有一段写的还可以。

    public sealed class CacheManager   {   private HttpApplicationState appPool = null;   /// <summar ...

  7. centos7 玩aapt 安卓应用apk解包工具的安装

    最近在做一个应用市场的项目,需要在centos7下面对apk解包读取其信息,这就想到了使用Google的解包工具aapt,但是由于中国的原因,国内访问原生工具的地址就有些麻烦,这里就贴出地址:http ...

  8. C#程序:如何创建xml文件以及xml文件的增、删、改、查

    其实今天的这篇博文 ,是对请几天发表的博文的一个总结,只是想把xml文件的增删改查结合起来,这样更容易让初学的朋友理解,废话也不多说了,开始吧! 下面是我把我在vs环境下写的代码ctrl+V然后ctr ...

  9. 通过javascript实现页面的横竖屏固定

    javascript是不能固定页面是横屏还是竖屏的,但是我们可以通过另外一种思路来监听window.orientation状态,假设我们要固定页面为横屏显示,则当window.orientation返 ...

  10. python运维开发之第二天

    一.模块初识: 1.模块定义 python是由一系列的模块组成的,每个模块就是一个py为后缀的文件,同时模块也是一个命名空间,从而避免了变量名称冲突的问题.模块我们就可以理解为lib库,如果需要使用某 ...