1. 创建方式

    //1.函数声明
function sum(num1,num2){
return num1+num2;
}
//2.函数表达式
var sum = function(num1,num2){
return num1+num2;
}
//3.使用new关键字,创建Function类型的实例----不推荐
var sum = new Function("num1","num2","return num1+num2;"); console.log(sum(1,2));//3

函数声明和函数表达式最大的区别是:函数声明提升(可以在声明前调用该函数)

2. 理解:“函数是对象,函数名是指向该对象的指针”

例1.

    function sum(num1, num2) {
return num1 + num2;
} var anotherSum = sum;
sum = null;
console.log(anotherSum(1, 2));//3

例2.

    function echo() {
return 4;
} function echo(num) {
return num;
} console.log(echo());//undefined

JavaScript中没有重载:函数名为绑定函数的引用,一个引用只能绑定一个函数对象,所以JS中函数没有重载!

3. 内置对象:arguments和this

 

arguments

该内置对象的行为非常类似Array类型,但实际上并非Array的实例。

例3.

function test(a,b,c){
console.log(arguments[0]);
console.log(arguments[1]);
console.log(arguments[2]);
console.log(arguments.length);
} test(1,'a');

arguments对象的长度是由实参个数而不是形参个数决定!

例2.

    function factorial(num){
if (1 == num) {
return 1;
} else if (num > 1) {
return num * arguments.callee(num - 1);
}
}

arguments属性callee为此arguments对象所在的当前函数引用,可以通过它实现递归,解耦函数名!

this

链接 http://www.cnblogs.com/ZHeGeS/p/4715570.html

 

4. 固有的属性和方法

 

caller

caller(保存调用当前函数的函数的引用),即调用者的引用。如果在全局作用域中调用当前函数,它的值为null

prototype

链接:http://www.cnblogs.com/ZHeGeS/p/4870332.html

call和apply

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

用法:

call(thisObj,var1,var2,var3)

apply(thisObj,[var1,var2,var3]/arguments)

区别:

call要逐个填入参数、apply不仅可以直接传入参数数组而且可以把当前函数的arguments对象传入!

    function sum(num1,num2){
return num1+num2;
}
function callsum1(num1,num2){
return sum.apply(this,arguments);//这里的this为window对象
}
function callsum2(num1,num2){
return sum.apply(this,[num1,num2]);
}
function callsum3(num1,num2){
return sum.call(this,num1,num2);
} console.log(callsum1(10,10)+" "+callsum2(10,10)+" "+callsum3(10,10));

call/apply真正强大的地方在于:扩充函数赖以运行的作用域的同时,不需要与方法有任何耦合关系!

例1.通过耦合的方式扩充作用域:

var name = "ZheG"
function echoName(){
alert(this.name);
}
var echo = {
name:"sansan",
echoName:echoName
} echoName();//"ZheG"
echo.echoName();//"sansan"

例2.采用apply/call通过解耦的方式扩充作用域:

var name = "ZheG"
function echoName(){
alert(this.name);
} var echo = {
name:"sansan"
} echoName();//"ZheG"
echoName.call(echo);//"sansan"
alert(echo.echoName);//undefined,可知echoName和对象echo没有任何关系了!

例3.

    $(".login-button:first").click(function(){

        $(this).attr("buttonName","loginBtn");
echoBtnName();//由于当时作用域中的this为windows,所以打印undefined
echoBtnName.call(this);//扩展echoBtnName作用域,使得this为当前点击Dom对象,打印“loginBtn”
}); function echoBtnName(){
//alert(this.buttonName);this只能获得原生的Dom属性,无法获得自定义的属性!
//alert(this.tagName);//获得标签名称
alert($(this).attr("buttonName"));//alert($(this).attr("buttonname"));也可以
}

JavaScript之Function类型的更多相关文章

  1. 浅析JavaScript之Function类型

    JavaScript中的函数实际上是对象,每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上只是指向函数对象的指针,保存函数在堆内存中的地 ...

  2. JavaScript高级 Function类型

    ·    Function类型 (属于引用类型) 1.JS中,有的函数均是对象,这个一个非常有特点的地方.它既然是对象,那么它的构造函数是谁呢?就是Function.(例如:function Pers ...

  3. JavaScript的Function 类型

    一,Function定义 Function实际上是对象,与其他引用类型一样具有属性和方法.Function可以通过三种方法进行定义,分别是函数声明语法定义,函数表达式定义和Function构造函数定义 ...

  4. JavaScript笔记——引用类型之Object类型和Function类型

    <JavaScript高级程序设计>中介绍的几种JavaScript的引用类型,本文只记了Object跟Function类型 Object类型 创建对象 var person = new ...

  5. 《JavaScript高级程序设计》读书笔记 ---Function 类型

    说起来ECMAScript 中什么最有意思,我想那莫过于函数了——而有意思的根源,则在于函数实际上是对象.每个函数都是Function 类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对 ...

  6. JavaScript中的Function类型浅析

    1. Function类型是js中引用类型之一,每个函数实际上都是Function类型的实例对象,具有自己的属性和方法.正因为函数式对象,所以函数名实际上也是一个指向函数对象的指针. 2. 常用的函数 ...

  7. JavaScript(第十天)【Function类型】

    在ECMAScript中,Function(函数)类型实际上是对象.每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象 ...

  8. Javascript高级编程学习笔记(16)—— 引用类型(5) Function类型

    JS中许多有趣的地方都和函数脱不了联系 那么是什么让JS中的函数这么有趣呢? 我们一起来看看吧 Function类型 在JS中函数实际上就是对象,每个函数都是Function类型的实例,和JS的其他引 ...

  9. 《JavaScript高级程序设计》5.5 Function类型

    5.5 Function类型 函数实质上是对象, 每个函数都是Function类型的实例, 并且都和其他引用类型一样具有属性和方法. 因此函数名实际上也是一个指向函数对象的指针, 不会与某个函数绑定. ...

随机推荐

  1. win7下wubi安装Ubuntu,重装win7后找回Ubuntu启动项

    怀念一下我的win7,使用了将近5年,最近终于慢慢处于崩溃且无法修复的状态. 还是重新安装了. 原本是win7下使用wubi安装Ubuntu.重装win7后,肯定没有了Ubuntu的启动项. 具体恢复 ...

  2. sp_send_dbmail权限问题

    这段时间处理SSIS服务器迁移的事情,在处理一个发送邮件的任务的时候,突然出现如下错误,  拒绝了对对象 'sp_send_dbmail' (数据库 'msdb',架构 'dbo')的 EXECUTE ...

  3. S2 结业考试前改错汇总

    1. PS:正确答案是A:枚举是值类型,一个类的对象是引用类型. 2. 每张表最多包含1个聚集索引.并且聚集索引会决定记录储存的物理位置.聚集索引不一定要建立在主键字段上.一张表可以没有任何索引. 3 ...

  4. iOS_icon命名规范 (iPhone_retina屏幕开发)

    iOS_icon命名规范  (iPhone_retina屏幕开发) 规则: 位置名称_功能名称_ 详细区分标志名称@2x.png navigationItem_leftBackIcon@2x.png ...

  5. android 开源项目学习<二>

    roottools:   RootTools gives Rooted developers easy access to common rooted tools...  https://code.g ...

  6. 用sharding技术来扩展你的数据库(一)sharding 介绍

    数据库的sharding技术作为一个“新瓶装旧酒”的概念,在新的应用环境中被赋予了新的意义.随着云计算的发展,sharding在最近几年是越来越火热,越来越多的产品开始声称自己支持sharding功能 ...

  7. ubuntu14.04如何卸载qq

    ubuntu安装了wine qq怎么去卸载呢?现在wine qq 比较好用的有ubuntukylin官网与deepin linux官网使用的deepin版本wine qq 2012国际版,还有Long ...

  8. Xcode6中使用initWithTitle:title image:image selectedImage:自定义图片

    使用xcode6来运行项目,发现使用原生的tabbar上的图片不显示了. 这个问题是因为xcode6中的一些api方法被废弃了,同时tabbar上图片的渲染方式发生了改变. 先看xcode6中的tab ...

  9. 虚机分配静态IP地址

    在为虚机分配静态IP地址池的IP时,如果报错“没有从与 VMSubnet 相关的 IP 池中为虚拟网络适配器 9i [MAC: 001DD8B71C17] 分配 CA (客户地址)” 使用“动态获取” ...

  10. powershell创建并加载配置文件

    $pshome :powershell的主目录 $profile :显示 Windows PowerShell 配置文件的路径 test-path $profile :确定是否已经在系统上创建了 Wi ...