zoukankan      html  css  js  c++  java
  • 5.5 function

    实例

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

    函数名是指向函数的指针,一个函数可能有多个名字

    function sum1(num1, num2){
    	return num1 + num2;
    }
    
    alert(sum1(1, 2));//3
    
    var anotherSum = sum1;
    l(anotherSum(10,10));//20
    sum1 = null;
    l(anotherSum(10,10));//20
    

    5.5.1 没有重载(深入理解)
    将函数名想象成指针

    function addSomeNumber(num){
    	return num + 100;
    }
    function addSomeNumber(num){
    	return num + 200;
    }
    addSomeNumber(100)//300
    
    
    var addSomeNumber  = function(num){
    	return num + 100;
    }
    
    addSomeNumber = function(num){
    	return num + 200;
    }
    addSomeNumber(100);//300
    创建第二个函数的时候,覆盖了引用第一个函数的变量addSomeNumber
    

    5.5.2 函数声明与函数表达式
    解析器解析的时候不是一视同仁:先读取函数声明,函数表达式要等解析器执行到它所在的代码行。

    alert(sum1(10, 10));//20
    function sum1(num1, num2){
    	return num1 + num2;
    }
    =====
    alert(sum1(10, 10));//sum1 is not a function
    var sum1 = function(num1,num2){
    	return num1 + num2;
    }
    
    

    5.5.3 作为值的函数

    function callSomeFunction(someFunction, someArgument){
    	return someFunction(someArgument);
    }
    
    function callSomeFunction(someFunction, someArgument){
    	return someFunction(someArgument);
    }
    function add10(num){
    	return num + 10;
    }
    
    var result = callSomeFunction(add10, 10);
    l(result);//20
    
    function getGreeting(name){
    	return 'hello ' + name;
    }
    var result2 = callSomeFunction(getGreeting, 'cjw');
    l(result2);//hello cjw
    
    function 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:'Zachary',age:228},{name:'Nicholas',age:29}];
    data.sort(createComparisonFunction('name'));
    l(data[0]);
    data.sort(createComparisonFunction('age'));
    l(data[0]);
    

    5.5.4 函数内部属性 arguments,this
    arguments: 一个类数组对象包含传入函数的所有参数
    arguments.callee: 指向拥有这个arguments对象的函数
    this: 引用的是函数据以执行的环境对象
    caller: 这个属性中保存着调用当前函数的函数的引用。

    function factorial(num){
    	if(num <= 1){
    		return 1;
    	}else{
    		return num * factorial(num-1);
    	}
    }
    
    l(factorial(5));
    //不受函数名限制
    function factorial(num){
    	if(num <= 1){
    		return 1;
    	}else{
    		return num * arguments.callee(num - 1);
    	}
    }
    

    this

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

    caller

    function outer(){
    	inner();
    }
    
    function inner(){
    	l(inner.caller);//ƒ outer(){inner();}
    }
    
    outer();
    
    function outer(){
    	inner();
    }
    
    function inner(){
    	l(arguments.callee.caller);
    }
    outer();
    

    5.5.5 函数属性和方法(length,prototype, call,apply,bind)
    length: 希望接受的命名参数的个数
    prototype:保存所有实例方法的真正所在
    call,apply: 扩充函数赖以运行的作用域
    apply: 运行函数的作用域,接收数组
    call:运行函数的作用域,接收参数
    length

    function sayName(name){
    	l(name);
    }
    function sum1(num1, num2){
    	return num1 + num2;
    }
    function sayHi(){
    	l('hi');
    }
    l(sayName.length);//1
    l(sum1.length);//2
    l(sayHi.length);//0
    

    apply,call

    function sum1(num1, num2){
    	return num1 + num2;
    }
    function callSum1(num1, num2){
    	return sum1.apply(this, arguments);
    }
    function callSum2(num1, num2){
    	return sum1.apply(this, [num1,num2]);
    }
    function callSum3(num1, num2){
    	return sum1.call(this, num1, num2);
    }
    l(callSum1(10, 10));//20
    l(callSum2(10, 10));//20
    l(callSum3(10, 10));//20
    

    扩充函数赖以生存的作用域

    window.color = 'red';
    var o = {color: 'blue'};
    function sayColor(){
    	l(this.color);
    }
    sayColor();
    
    sayColor.call(this);//red
    sayColor.call(window);//red
    sayColor.call(o);//blue
    

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

    window.color = "red";
    
    var o = {color:"blue"};
    function sayColor(){
    	l(this.color);
    }
    var objSayColor = sayColor.bind(o);
    objSayColor();//blue
    
  • 相关阅读:
    怎样去阅读一份php源代码
    Cloudera Hadoop 4系列实战课程(电商业日志流量分析项目)
    ORACLE系列之SQL从入门到精通(全面把控数据库基础)
    jQuery2.0应用开发:SSH框架整合jQuery2.0实战OA办公自动化
    Unity3D游戏引擎实战开发从入门到精通
    中国移动:物联网项目实战开发企业级应用(ssp框架应用、EXTJS4.2、GoogleMap、JPA)
    基于OpenLayers实战地理信息系统(离线地图,通过基站转经纬度,Quartz深入,轨迹实战)
    Android自动化测试从入门到精通
    博客从新开张啦!
    python scrapy版 极客学院爬虫V2
  • 原文地址:https://www.cnblogs.com/caijw/p/8150938.html
Copyright © 2011-2022 走看看