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类型的实例, 并且都和其他引用类型一样具有属性和方法. 因此函数名实际上也是一个指向函数对象的指针, 不会与某个函数绑定. ...
随机推荐
- object c小代码——日期篇
1.判断两个日期是否是同一天,不要求小时,分钟要一样 用法 NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier: ...
- javaweb之javascript结合(三)
1.案例一:在末尾添加节点 第一步:获取到ul标签 第二步:创建li标签 document.createElement("标签名称")方法 第三步:创建文本 document.cr ...
- Spark系列(一)Spark1.0.0源码编译及安装
最近想对自己学的东西做些回顾,想到写博客是个不错的方式,方便他人也有利自己,刚开始写不足之处大家多担待. 编译前需要安装JDK1.6以上.scala.Maven.Ant.hadoop2.20 如下图( ...
- 问题-[Delphi]MainFrame.pas(4340): E2036 Variable required
问题现象:写了一个TObjectList的Sort方法,但是写成ObjectList.Sort(@SortBridgeEDOReportQtys); 再F9时提示“E2036 Variable req ...
- poj 1149 PIGS【最大流经典建图】
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18727 Accepted: 8508 Description ...
- 七行jquery代码实现图片渐变切换【兼容ie6+、 Chrome、 Firefox】
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Filter 配置多个URL-PATTERN
Filter 配置多个URL-PATTERN 最近做项目遇到一个Filter需要配置多个url-pattern,上网查了下资料,经测试,现总结下 一.完全错误的方式 Java代码 <fil ...
- [USACO08JAN]电话线Telephone Lines
多年以后,笨笨长大了,成为了电话线布置师.由于地震使得某市的电话线全部损坏,笨笨是负责接到震中市的负责人.该市周围分布着N(1<=N<=1000)根据1……n顺序编号的废弃的电话线杆,任意 ...
- 用HiveDB横向切分MySQL数据库
HiveDB是一个用来横向切分mysql数据库的开源框架,构建一个高性能和可扩展的基于mysql的系统需要大量的系统设计经验和良好的代码的实现,一个比较好的策略是将你的数据横向切分在多个server上 ...
- C++编译器函数模版机制剖析 - 函数模版的本质
思考:为什么函数模板能够和函数重载放在一块.C++编译器是怎样提供函数模板机制的? demo 1 #include <cstdio> #include <iostream> u ...