引用类型——function

Function类型



  函数其实是对象,每个函数都是function类型的实例,一样具有属性和方法,因此,函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。

函数的声明

//函数声明
function sum(num1,num2){
     return num1+num2
}

或者

//函数表达式
var sum=function(num1,num2){
     return num1+num2;
};

或者

var sum=new Function("num1","num2","return num1+num2"); //不推荐

函数声明和函数表达式是有区别的,解析器会率先读取函数声明,并使其置于任何代码之前;而函数表达式,则必须等到解析器执行到它所在的代码行,才别执行。

alert(sum(10,10)); //这是正确的,20
function sum(num1,num2){
    return num1+num2;
}

alert(sum(10,10)); //这是错误的
var sum=function(num1,num2){
    return num1+num2;
}

JavaScript中函数是没有重载的,这正是由于函数名其实是一个指针,因此,同名的函数会把之前的指针覆盖掉:

funtion Add(num){
    return num + 100;
}
funtion Add(num){
    return num + 200;
}
var result=Add(100); //300 

做为值的函数

因为JavaScript中的函数名本身就是变量,所以函数也可以当作值来使用。也就是说,不仅可以想传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回

function callSomeFunction(someFunction, someArgument){
    return someFunction(someArgument);
}
function add10(num){
    return num + 10;
}
var result1 = callSomeFunction(add10, 10);
alert(result1);   //20  

function getGreeting(name){
    return "Hello, " + name;
}
var result2 = callSomeFunction(getGreeting, "Nicholas");
alert(result2);   //"Hello, Nicholas" 

这里的callSomeFunction()函数是通用的,即无论第一个参数传递进来是一个什么函数,它都会返回执行执行第一个参数后的结果。当然,大家应该知道,要访问函数的指针而不执行函数的话,必须去掉函数名后面的那对括号

函数的内部属性

arguments.callee

在函数内部,有两个特殊的对象:arguments和this,arguments是一个数组对象,包含传入的所有参数,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,其行为和java和C#中的this基本类似。换句话说,this引用的是函数据以执行的环境对象(当在网页全局作用域中调用函数时,this对象引用的就是window),来看下面的例子:

window.color = "red";
var o = { color: "blue" };
function sayColor(){
    alert(this.color);
}
sayColor();     //"red"
o.sayColor = sayColor;
o.sayColor();   //"blue"

上面这段代码,当在全局作用域中调用sayColor()时,this对象引用的是全局对象window.换句话说,对this.color的求值会转换成对window.color的求值,于是结果返回了"red"。但是当把这个函数赋给对象o,并调用o.sayColor()的时候,this引用的是对象o,因此对this.color的求值会转换成对o.color的求值,于是结果返回"blue"

函数的属性和方法

length和prototype属性

每个函数都包含两个属性,length和prototype,length属性表示函数接收的命名参数的个数。

function sayName(name){
    alert(name);
}
function sum(num1, num2){
    return num1 + num2;
}
function sayHi(){
    alert("hi");
}
alert(sayName.length);      //1
alert(sum.length);          //2
alert(sayHi.length);        //0 

call()和apply()方法

这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象指向的值。apply()方法接收两个参数:一个是在其中运行函数的作用域,另一个是参数数组。其中第二个参数可以是Array的实例,也可以是arguments对象。

function sum(num1,num2){
    return num1+num2;
}
function callSum(num1,num2){
    return sum.apply(this,arguments);  //传入aguments对象
}
function callSum2(num1,num2){
    return sum.apply(this,[num1,num2]);  //传入数组
}
alert(callSum(10,10));  //20
alert(callSum2(10,10)); //20

call()方法的第一个参数是作用域没有变化,变化的是其余的参数必须直接传递给函数。

function sum(num1,num2){
    return num1+num2;
    }
function callSum(num1,num2){
    return sum.call(this,num1,num2);
    }
alert(callSum(10,10));

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(o);        //blue
时间: 2024-10-12 12:26:54

引用类型——function的相关文章

引用类型--Function类型

在ECMAScript中函数实际上是对象.每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定.函数通常是使用函数声明(定义函数的方法之一)语法定义的,如: function sum(num1 , num2){ returnnum1 + num2; } 这与下面使用函数表达式(定义函数的方法之二)定义函数的方式几乎相差无几: var sum = function(num1 , num2){

javascript学习笔记 - 引用类型 Function

五 Function类型 每个函数都时Function类型的实例.函数也是对象. 声明函数: function func_name () {} //javascript解析器会在程序执行时率先读取函数声明,使其在执行任何代码之前可用(可访问) var func_name = function(){}; //解析器执行到它所在的代码行,才会被解释执行. 因此函数名是个变量,保存的是指向函数对象的指针,不会与某个函数绑定,与包含对象指针的其他变量没什么区别. 1.没有重载 声明两个同名的函数,第二个

[重点] 原型链详解

回顾js 内存分配以及垃圾回收 - 垃圾回收查看笔记: js 内存篇 js 变量内存存放位置 - 基本类型的变量存放在栈中 - 引用对象(包括new 出来的对象)的值放在堆中, 而在栈中存放一个指针指向堆中的值(所以表面上变量都是存放在栈) js 几个重要的概念 Function: 函数对象 Object: 对象 prototype 属性 : - 指向一个对象(原型对象), 原型对象是js为了实现继承和代码复用, 而暴露给程序员的类似原型链的一个开放接口 - 原型对象包括程序员定义的复用的方法和

js中函数参数值传递和引用传递

js中函数参数值传递和引用传递:在阅读本章节之前建议参阅一下两章节:1.值类型可以参阅javascript的值类型一章节.2.引用类型可以参阅javascript的引用类型一章节.一.函数传递值类型:代码实例如下: function addNum(num) { num+=10; return num; } var num=10; var result=addNum(num); console.log(num); console.log(result); 以上代码的弹出值分别为:10和20,下面进

JavaScript 变量的作用域

一. 基本类型和引用类型 基本类型值指的是简单的数据段,而引用类型值指的是那个可能由多个值组成的对象   将一个值赋值给变量时,javascript解析器首先要确定是基本类型还是引用类型,基本数据类型可以直接操作保存在变量中的值,而引用数据类型的值是保存在内存中的对象,在操作对象时,实际上操作的是对象的引用而不是实际的对象 二. 变量的赋值 1. 如果从一个变量上向另一个变量上复制__基本数据类型__的值,会在变量对象上创建一个新值,然后把该值复制到新变量的位置上,这个很好理解,来看下例子: v

总结(JS)

1.javascript变量的作用域 变量的赋值 如果从一个变量上向另一个变量上复制__基本数据类型__的值,会在变量对象上创建一个新值,然后把该值复制到新变量的位置上,这个很好理解,来看下例子: var num1 = 5; var num2 = num1;  这是基本数据类型,而引用类型呢?其实同样会将原来变量上的值复制一份到新的变量当中,只不过,复制的其实是原来变量的一个指针,而这个指针指向存储在堆中的一个对象.复制完成后,两个变量都指向了堆中的同一个对象,所以改变其中一个的值,会对另外一个

&lt;JS高级程序设计3&gt;_PART4

1.基本数据类型:Undefined,null,Number,String,Boolean.引用数据类型:保存在内存中的对象. 2.JS不允许直接访问内存中的位置,不能直接操作对象的内存空间.所以操作对象时,实际上是操作的对象的引用,而不是实际的对象. 3. var num1 = 1; var num2 = num1; 一个基本类型的变量向另一个赋值时,执行了复制操作,两个变量互不影响. var obj1 = new Object(); var obj2 = obj1; obj1.age = 2

javascript笔记4-函数表达式

一般形式的创建函数,在执行代码之前会先读取函数声明,所以可以把函数声明写在函数调用的下面: sayHi(); function sayHi(){ alert("Hi!"); } 使用函数表达式创建函数,调用前必须先赋值: sayHi(); //错误!!函数不存在 var sayHi=function(){ alert("Hi!"); } 递归. 一般递归 function factorial(num){ if (num <= 1){ return 1; } e

javascript中的内置对象总结

内置对象 标准内置对象 Object Object.create Object.prototype.toString Object.prototype.hasOwnProperty Boolean String String.prototype.indexOf String.prototype.replace String.prototype.split Number Number.prototype.toFixed Array Array.prototype.splice Array.prot