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类型的实例, 并且都和其他引用类型一样具有属性和方法. 因此函数名实际上也是一个指向函数对象的指针, 不会与某个函数绑定. ...
随机推荐
- 终于写好了SR4000的一个实用类了
/*----------------------------------------------------------------------------- * * 版权声明: * 可以 ...
- 曲面Shader
这是一个能让平面呈现出曲面效果的Shaer. 代码: Shader "Custom/CurvedWorld"{ Properties { // Diffuse texture _M ...
- bzoj 2242 [SDOI2011]计算器(数论知识)
Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...
- hdu 3549 Flow Problem (最大流)
裸最大流,做模板用 m条边,n个点,求最大流 #include <iostream> #include <cstdio> #include <cstring> #i ...
- 在C#中生成唯一的字符串和数字【GUID】转
转自:http://www.cnblogs.com/lcwzj/archive/2009/04/16/1436992.html 当我们想要获得一个唯一的key的时候,通常会想到GUID.这个key非常 ...
- A Tour of Go Type conversions
The expression T(v) converts the value v to the type T. Some numeric conversions: var i int = 42 var ...
- jquery实现公告上下滚动显示
js: // JavaScript Documentfunction b(){ t = parseInt(x.css('top')); y.css('top','19px'); x.animate({ ...
- css Spirtes 错位问题解决
本文为转载内容,原文链接: https://github.com/banricho/webLog/issues/1
- iframe与include的区别
iframe与include区别和使用问题 1.iframe可以用在静态和动态页面,include只能用在动态页面. 2.iframe是视图级组合,include是代码级组合. 3.iframe独立成 ...
- null值是不会算在count以内的
做统计的时候,null是不计算在count以内的.所以字段的值最好不要设置为null. 比如:select count(user_id) as beyond_num from fs_users_add ...