JavaScript之Function类型
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类型的更多相关文章
- 浅析JavaScript之Function类型
JavaScript中的函数实际上是对象,每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上只是指向函数对象的指针,保存函数在堆内存中的地 ...
- JavaScript高级 Function类型
· Function类型 (属于引用类型) 1.JS中,有的函数均是对象,这个一个非常有特点的地方.它既然是对象,那么它的构造函数是谁呢?就是Function.(例如:function Pers ...
- JavaScript的Function 类型
一,Function定义 Function实际上是对象,与其他引用类型一样具有属性和方法.Function可以通过三种方法进行定义,分别是函数声明语法定义,函数表达式定义和Function构造函数定义 ...
- JavaScript笔记——引用类型之Object类型和Function类型
<JavaScript高级程序设计>中介绍的几种JavaScript的引用类型,本文只记了Object跟Function类型 Object类型 创建对象 var person = new ...
- 《JavaScript高级程序设计》读书笔记 ---Function 类型
说起来ECMAScript 中什么最有意思,我想那莫过于函数了——而有意思的根源,则在于函数实际上是对象.每个函数都是Function 类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对 ...
- JavaScript中的Function类型浅析
1. Function类型是js中引用类型之一,每个函数实际上都是Function类型的实例对象,具有自己的属性和方法.正因为函数式对象,所以函数名实际上也是一个指向函数对象的指针. 2. 常用的函数 ...
- JavaScript(第十天)【Function类型】
在ECMAScript中,Function(函数)类型实际上是对象.每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象 ...
- Javascript高级编程学习笔记(16)—— 引用类型(5) Function类型
JS中许多有趣的地方都和函数脱不了联系 那么是什么让JS中的函数这么有趣呢? 我们一起来看看吧 Function类型 在JS中函数实际上就是对象,每个函数都是Function类型的实例,和JS的其他引 ...
- 《JavaScript高级程序设计》5.5 Function类型
5.5 Function类型 函数实质上是对象, 每个函数都是Function类型的实例, 并且都和其他引用类型一样具有属性和方法. 因此函数名实际上也是一个指向函数对象的指针, 不会与某个函数绑定. ...
随机推荐
- win7下wubi安装Ubuntu,重装win7后找回Ubuntu启动项
怀念一下我的win7,使用了将近5年,最近终于慢慢处于崩溃且无法修复的状态. 还是重新安装了. 原本是win7下使用wubi安装Ubuntu.重装win7后,肯定没有了Ubuntu的启动项. 具体恢复 ...
- sp_send_dbmail权限问题
这段时间处理SSIS服务器迁移的事情,在处理一个发送邮件的任务的时候,突然出现如下错误, 拒绝了对对象 'sp_send_dbmail' (数据库 'msdb',架构 'dbo')的 EXECUTE ...
- S2 结业考试前改错汇总
1. PS:正确答案是A:枚举是值类型,一个类的对象是引用类型. 2. 每张表最多包含1个聚集索引.并且聚集索引会决定记录储存的物理位置.聚集索引不一定要建立在主键字段上.一张表可以没有任何索引. 3 ...
- iOS_icon命名规范 (iPhone_retina屏幕开发)
iOS_icon命名规范 (iPhone_retina屏幕开发) 规则: 位置名称_功能名称_ 详细区分标志名称@2x.png navigationItem_leftBackIcon@2x.png ...
- android 开源项目学习<二>
roottools: RootTools gives Rooted developers easy access to common rooted tools... https://code.g ...
- 用sharding技术来扩展你的数据库(一)sharding 介绍
数据库的sharding技术作为一个“新瓶装旧酒”的概念,在新的应用环境中被赋予了新的意义.随着云计算的发展,sharding在最近几年是越来越火热,越来越多的产品开始声称自己支持sharding功能 ...
- ubuntu14.04如何卸载qq
ubuntu安装了wine qq怎么去卸载呢?现在wine qq 比较好用的有ubuntukylin官网与deepin linux官网使用的deepin版本wine qq 2012国际版,还有Long ...
- Xcode6中使用initWithTitle:title image:image selectedImage:自定义图片
使用xcode6来运行项目,发现使用原生的tabbar上的图片不显示了. 这个问题是因为xcode6中的一些api方法被废弃了,同时tabbar上图片的渲染方式发生了改变. 先看xcode6中的tab ...
- 虚机分配静态IP地址
在为虚机分配静态IP地址池的IP时,如果报错“没有从与 VMSubnet 相关的 IP 池中为虚拟网络适配器 9i [MAC: 001DD8B71C17] 分配 CA (客户地址)” 使用“动态获取” ...
- powershell创建并加载配置文件
$pshome :powershell的主目录 $profile :显示 Windows PowerShell 配置文件的路径 test-path $profile :确定是否已经在系统上创建了 Wi ...