码迷,mamicode.com
首页 > 其他好文 > 详细

Function类型

时间:2017-08-16 14:03:59      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:bin   添加   枚举   nbsp   this   class   警告   方式   out   

Function类型

1 函数声明语法:

//方法一
function sum (num1, num2) {
    return num1 + num2;
}

//方法二
var sum = function(num1, num2) {
    return num1 + num2;
};        //不要忘了分号

注意,函数名是指向函数的指针,与其包含对象的指针没有什么不同。

由于ECMAScript中的函数可以传入多个参数,因此并没有重载。

 

2 函数声明与函数表达式

 解释器会先读取函数声明,使其在执行任何代码之前可用(函数声明提升),函数表达式则必须等到解释器执行到它所在的代码行,才会真正被解释执行。例:

alert(sum(10, 10));                    //函数表达式
function sum(num1, num2) {      
    return num1 + num2;
}                                     //函数声明

 

以上代码能被正确执行,因为函数声明被优先读取并添加到执行环境。

3 作为值的函数

可以像传递参数一样把一个函数传递给另一个函数,传递的是函数指针,不能带括号

function callSomeFunction(someFunction, someArgument) {
     return someFunction(someArgument);
}

 

 可以在一个函数中返回另一个函数

unction createComparisonFunction(propertyName) {
    return function(object1, object2) {
        var value1 = object1.[propertyName];
        var value2 = object2.[propertyName];
        if (value1 < value2) {
            return -1;
        } else if (value1 > value2) {
            return 1;
        } else {
            return 0;
        }
    };
}

var data = [{name : "Zchary", age : 28}, {name : "Nicholas", age : 29}];
data.sort(createComparisonFunction("name"));
alert(data[0].name);                //Nicholas
data.sort(createComparisonFunction("age"));
alert(data[0].name);                //Zachary

 

 

 4 函数内部属性

4.1 auguments

  arguments是个数组对象,包含着传入函数的参数。它有一个callee属性,是个指向函数本身的指针。

var factorial(num) {
    if (num <= 1){
        return num;
    }
    return num * factorial(num-1);      //当函数名改变时,这个语句也要改变,否则函数失效
}

var factorial(num) {
    if (num <= 1) {
        return num;
    }
    return num*arguments.callee(num-1);       //此时与函数名无关,改变函数名函数也生效
}

 

 4.2 this

   this是对调用函数的对象的引用。当在全局作用域调用函数时,this引用的是window。

 

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

sayColor();        //"red",此时this引用window
o.sayColor = sayColor();
o.sayColor();        //"blue",此时this引用o

 

 

 4.3 caller

这是ES5规范化的一个属性,它保存着调用当前函数的函数的引用。

function outer() {
    inner();
}
function inner(){
    alert(inner.caller);
}
outer();         //警告框中显示outer()的源代码

 

 5 函数属性和方法

5.1 每个函数都包含两个属性:

  • length:表示函数希望接收的命名参数的个数,如:
    function sayName(name) {
        alert(name);
    }
    
    function sum(num1, num2) {
        return num1 + num2;
    }
    
    function sayHi() { 
        alert("Hi);
    }
    alert(sayHi.length);        //0
    alert(sayName.length);            //1
    alert(sum.length);           //2

     

  • prototype:对于引用类型,prototype是保存它们所有实例方法的真正所在。它不可以枚举

5.2 每个函数都含有两个非继承而来的方法

  • apply():接受两个参数,一个是在其中运行函数的作用域,另一个是参数数组。第二个参数可以是Array实例,也可以是arguments对象。
    function() sum(num1, num2) {
        return num1 + num2;
    }
    function callSum1(num1, num2) {
        return sum.apply(this, arguments);
    }
    function callSum2(num1, num2) {
        return sum.apply(this, [num1, num2]);
    }
    
    alert(callSum1(10, 10));       //20
    alert(callSum2(10, 10));       //20

     

  • call():与apply()相同,只是传入参数方式不同:第一个是this, 其余参数都是直接传递给函数。
    function sum(num1, num2) {
        reutnr num1 + num2;
    }
    function callSum(num1, num2) {
        return sum.call(this, num1, num2);
    }
    alert(callSum(10, 10));         //20

优点:使用call()或apply()可以扩充函数赖以运行的作用域,使对象与方法不需要有任何耦合。

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

 

bind()方法:创建一个函数实例,其this值会被绑定到传递给bind()函数的值。  

支持的浏览器:IE9++,Firefox4+, Safari5.1+,Opera12+和Chrome

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

var objectSayColor = sayColor.bind(o);
objectSayColor();            //blue

 

Function类型

标签:bin   添加   枚举   nbsp   this   class   警告   方式   out   

原文地址:http://www.cnblogs.com/chen-zed/p/7365149.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!